ConceptPortal-public/rsconcept/backend/apps/rsform/models/Editor.py

72 lines
2.0 KiB
Python
Raw Normal View History

2024-05-24 15:40:28 +03:00
''' Models: Editor. '''
from typing import TYPE_CHECKING
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
if TYPE_CHECKING:
from .LibraryItem import LibraryItem
class Editor(Model):
''' Editor list. '''
item: ForeignKey = ForeignKey(
verbose_name='Схема',
to='rsform.LibraryItem',
on_delete=CASCADE
)
editor: ForeignKey = ForeignKey(
verbose_name='Редактор',
to=User,
on_delete=CASCADE,
null=True
)
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: 'LibraryItem', user: User) -> bool:
2024-05-24 15:40:28 +03:00
''' Add Editor for item. '''
if Editor.objects.filter(item=item, editor=user).exists():
2024-05-24 15:40:28 +03:00
return False
Editor.objects.create(item=item, editor=user)
2024-05-24 15:40:28 +03:00
return True
@staticmethod
def remove(item: 'LibraryItem', user: User) -> bool:
2024-05-24 15:40:28 +03:00
''' Remove Editor. '''
editor = Editor.objects.filter(item=item, editor=user)
2024-05-24 15:40:28 +03:00
if not editor.exists():
return False
editor.delete()
return True
@staticmethod
@transaction.atomic
def set(item: 'LibraryItem', users: list[User]):
''' Set editors for item. '''
processed: list[User] = []
for editor_item in Editor.objects.filter(item=item):
2024-06-23 14:20:52 +03:00
if editor_item.editor not in users:
editor_item.delete()
else:
processed.append(editor_item.editor)
for user in users:
2024-06-23 14:20:52 +03:00
if user not in processed:
processed.append(user)
Editor.objects.create(item=item, editor=user)