Portal/rsconcept/backend/apps/library/models/Editor.py

92 lines
2.8 KiB
Python
Raw Normal View History

2024-06-07 20:17:03 +03:00
''' Models: Editor. '''
from typing import Iterable
2024-06-07 20:17:03 +03:00
from django.db import transaction
from django.db.models import CASCADE, DateTimeField, ForeignKey, Model
from apps.users.models import User
class Editor(Model):
''' Editor list. '''
item: ForeignKey = ForeignKey(
verbose_name='Схема',
to='library.LibraryItem',
2024-06-07 20:17:03 +03:00
on_delete=CASCADE
)
editor: ForeignKey = ForeignKey(
verbose_name='Редактор',
to=User,
on_delete=CASCADE
2024-06-07 20:17:03 +03:00
)
time_create: DateTimeField = DateTimeField(
verbose_name='Дата добавления',
auto_now_add=True
)
class Meta:
''' Model metadata. '''
verbose_name = 'Редактор'
verbose_name_plural = 'Редакторы'
unique_together = [['item', 'editor']]
def __str__(self) -> str:
return f'{self.item}: {self.editor}'
@staticmethod
def add(item: int, user: int) -> bool:
2024-06-07 20:17:03 +03:00
''' Add Editor for item. '''
if Editor.objects.filter(item_id=item, editor_id=user).exists():
2024-06-07 20:17:03 +03:00
return False
Editor.objects.create(item_id=item, editor_id=user)
2024-06-07 20:17:03 +03:00
return True
@staticmethod
def remove(item: int, user: int) -> bool:
2024-06-07 20:17:03 +03:00
''' Remove Editor. '''
editor = Editor.objects.filter(item_id=item, editor_id=user).only('pk')
2024-06-07 20:17:03 +03:00
if not editor.exists():
return False
editor.delete()
return True
@staticmethod
@transaction.atomic
def set(item: int, users: Iterable[int]):
2024-06-07 20:17:03 +03:00
''' Set editors for item. '''
processed: set[int] = set()
2024-08-06 23:13:57 +03:00
for editor_item in Editor.objects.filter(item_id=item).only('editor_id'):
editor_id = editor_item.editor_id
if editor_id not in users:
2024-06-07 20:17:03 +03:00
editor_item.delete()
else:
processed.add(editor_id)
for user in users:
if user not in processed:
processed.add(user)
Editor.objects.create(item_id=item, editor_id=user)
@staticmethod
@transaction.atomic
def set_and_return_diff(item: int, users: Iterable[int]) -> tuple[list[int], list[int]]:
''' Set editors for item and return diff. '''
processed: list[int] = []
deleted: list[int] = []
added: list[int] = []
2024-08-06 23:13:57 +03:00
for editor_item in Editor.objects.filter(item_id=item).only('editor_id'):
editor_id = editor_item.editor_id
if editor_id not in users:
deleted.append(editor_id)
editor_item.delete()
else:
processed.append(editor_id)
2024-06-07 20:17:03 +03:00
for user in users:
2024-06-23 14:20:37 +03:00
if user not in processed:
2024-06-07 20:17:03 +03:00
processed.append(user)
added.append(user)
Editor.objects.create(item_id=item, editor_id=user)
return (added, deleted)