ConceptPortal-public/rsconcept/backend/apps/library/models/LibraryItem.py

131 lines
3.1 KiB
Python
Raw Normal View History

''' Models: LibraryItem. '''
import re
from django.db.models import (
2024-05-24 18:31:14 +03:00
SET_NULL,
BooleanField,
CharField,
DateTimeField,
ForeignKey,
Model,
2024-07-19 19:29:27 +03:00
QuerySet,
2024-05-24 18:31:14 +03:00
TextChoices,
TextField
)
from apps.users.models import User
2024-05-24 18:31:14 +03:00
from .Version import Version
class LibraryItemType(TextChoices):
''' Type of library items '''
RSFORM = 'rsform'
2024-07-15 12:36:18 +03:00
OPERATION_SCHEMA = 'oss'
class AccessPolicy(TextChoices):
''' Type of item access policy. '''
PUBLIC = 'public'
PROTECTED = 'protected'
PRIVATE = 'private'
class LocationHead(TextChoices):
''' Location prefixes. '''
PROJECTS = '/P'
LIBRARY = '/L'
USER = '/U'
COMMON = '/S'
2024-06-04 11:26:20 +03:00
_RE_LOCATION = r'^/[PLUS]((/[!\d\w]([!\d\w\- ]*[!\d\w])?)*)?$' # cspell:disable-line
def validate_location(target: str) -> bool:
return bool(re.search(_RE_LOCATION, target))
class LibraryItem(Model):
''' Abstract library item.'''
item_type = CharField(
verbose_name='Тип',
max_length=50,
choices=LibraryItemType.choices,
default=LibraryItemType.RSFORM
)
owner = ForeignKey(
verbose_name='Владелец',
to=User,
on_delete=SET_NULL,
blank=True,
null=True
)
title = TextField(
verbose_name='Название'
)
alias = CharField(
verbose_name='Шифр',
max_length=255,
blank=True
)
comment = TextField(
verbose_name='Комментарий',
blank=True
)
visible = BooleanField(
verbose_name='Отображаемая',
default=True
)
read_only = BooleanField(
verbose_name='Запретить редактирование',
default=False
)
access_policy = CharField(
verbose_name='Политика доступа',
max_length=500,
choices=AccessPolicy.choices,
default=AccessPolicy.PUBLIC
)
location = TextField(
verbose_name='Расположение',
max_length=500,
default=LocationHead.USER
)
time_create = DateTimeField(
verbose_name='Дата создания',
auto_now_add=True
)
time_update = DateTimeField(
verbose_name='Дата изменения',
auto_now=True
)
class Meta:
''' Model metadata. '''
verbose_name = 'Схема'
verbose_name_plural = 'Схемы'
def __str__(self) -> str:
2024-05-24 15:40:28 +03:00
return f'{self.alias}'
def get_absolute_url(self):
return f'/api/library/{self.pk}'
def getQ_editors(self) -> QuerySet[User]:
2024-05-24 15:40:28 +03:00
''' Get all Editors of this item. '''
return User.objects.filter(editor__item=self.pk)
2024-05-24 15:40:28 +03:00
def getQ_versions(self) -> QuerySet[Version]:
2024-07-19 19:29:27 +03:00
''' Get all Versions of this item. '''
return Version.objects.filter(item=self.pk).order_by('-time_create')
def is_synced(self, target: 'LibraryItem') -> bool:
''' Check if item is synced with target. '''
if self.owner != target.owner:
return False
if self.location != target.location:
return False
return True