2024-05-24 15:40:28 +03:00
|
|
|
''' Models: Editor. '''
|
2024-08-06 22:35:53 +03:00
|
|
|
from typing import Iterable
|
2024-05-24 15:40:28 +03:00
|
|
|
|
2024-05-26 00:46:58 +03:00
|
|
|
from django.db import transaction
|
2024-05-24 18:31:14 +03:00
|
|
|
from django.db.models import CASCADE, DateTimeField, ForeignKey, Model
|
2024-05-24 15:40:28 +03:00
|
|
|
|
|
|
|
from apps.users.models import User
|
|
|
|
|
|
|
|
|
|
|
|
class Editor(Model):
|
|
|
|
''' Editor list. '''
|
2024-09-12 20:56:56 +03:00
|
|
|
item = ForeignKey(
|
2024-05-24 15:40:28 +03:00
|
|
|
verbose_name='Схема',
|
2024-07-25 19:12:59 +03:00
|
|
|
to='library.LibraryItem',
|
2024-05-24 15:40:28 +03:00
|
|
|
on_delete=CASCADE
|
|
|
|
)
|
2024-09-12 20:56:56 +03:00
|
|
|
editor = ForeignKey(
|
2024-05-24 15:40:28 +03:00
|
|
|
verbose_name='Редактор',
|
|
|
|
to=User,
|
2024-08-06 22:35:53 +03:00
|
|
|
on_delete=CASCADE
|
2024-05-24 15:40:28 +03:00
|
|
|
)
|
2024-09-12 20:56:56 +03:00
|
|
|
time_create = DateTimeField(
|
2024-05-24 15:40:28 +03:00
|
|
|
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
|
2024-08-06 22:35:53 +03:00
|
|
|
def add(item: int, user: int) -> bool:
|
2024-05-24 15:40:28 +03:00
|
|
|
''' Add Editor for item. '''
|
2024-08-06 22:35:53 +03:00
|
|
|
if Editor.objects.filter(item_id=item, editor_id=user).exists():
|
2024-05-24 15:40:28 +03:00
|
|
|
return False
|
2024-08-06 22:35:53 +03:00
|
|
|
Editor.objects.create(item_id=item, editor_id=user)
|
2024-05-24 15:40:28 +03:00
|
|
|
return True
|
|
|
|
|
|
|
|
@staticmethod
|
2024-08-06 22:35:53 +03:00
|
|
|
def remove(item: int, user: int) -> bool:
|
2024-05-24 15:40:28 +03:00
|
|
|
''' Remove Editor. '''
|
2024-08-06 22:35:53 +03:00
|
|
|
editor = Editor.objects.filter(item_id=item, editor_id=user).only('pk')
|
2024-05-24 15:40:28 +03:00
|
|
|
if not editor.exists():
|
|
|
|
return False
|
|
|
|
editor.delete()
|
|
|
|
return True
|
2024-05-26 00:46:58 +03:00
|
|
|
|
|
|
|
@staticmethod
|
|
|
|
@transaction.atomic
|
2024-08-06 22:35:53 +03:00
|
|
|
def set(item: int, users: Iterable[int]):
|
2024-05-26 00:46:58 +03:00
|
|
|
''' Set editors for item. '''
|
2024-08-06 22:35:53 +03:00
|
|
|
processed: set[int] = set()
|
2024-08-06 23:14:09 +03:00
|
|
|
for editor_item in Editor.objects.filter(item_id=item).only('editor_id'):
|
2024-08-06 22:35:53 +03:00
|
|
|
editor_id = editor_item.editor_id
|
|
|
|
if editor_id not in users:
|
2024-05-26 00:46:58 +03:00
|
|
|
editor_item.delete()
|
|
|
|
else:
|
2024-08-06 22:35:53 +03:00
|
|
|
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:14:09 +03:00
|
|
|
for editor_item in Editor.objects.filter(item_id=item).only('editor_id'):
|
2024-08-06 22:35:53 +03:00
|
|
|
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-05-26 00:46:58 +03:00
|
|
|
|
|
|
|
for user in users:
|
2024-06-23 14:20:52 +03:00
|
|
|
if user not in processed:
|
2024-05-26 00:46:58 +03:00
|
|
|
processed.append(user)
|
2024-08-06 22:35:53 +03:00
|
|
|
added.append(user)
|
|
|
|
Editor.objects.create(item_id=item, editor_id=user)
|
|
|
|
|
|
|
|
return (added, deleted)
|