Files
Aerbim/DocsApp/models.py
2024-07-18 13:33:46 +03:00

154 lines
4.6 KiB
Python

from django.db import models
from BaseModels.base_models import BaseModelViewPage, BaseModel
from ckeditor_uploader.fields import RichTextUploadingField
from django.utils.translation import gettext_lazy as _
from datetime import datetime
class DocVersion(BaseModel):
url = models.TextField(
verbose_name=_('URL привязанной страницы'), unique=True,
help_text=_('можно изменить адрес страницы (!!! ВНИМАНИЕ !!! поисковые системы потеряют страницу и найдут лишь спустя неделю...месяц)')
)
def get_article(self, art_url=None):
art = None
if art_url:
try:
art = self.rel_docArts_for_version.get(enable=True, url=art_url)
except DocArt.DoesNotExist:
art = None
if not art:
art = self.rel_docArts_for_version.filter(
enable=True, parent=None
).order_by('order').first()
return art
class Meta:
verbose_name = _('Версия документации')
verbose_name_plural = _('Версии документации')
ordering = ['order', 'name']
class DocArt(BaseModelViewPage):
parent = models.ForeignKey(
'DocArt', verbose_name=_('Родитель'),
null=True, blank=True,
on_delete=models.SET_NULL,
related_name='rel_childArts_for_docArt'
)
versions = models.ManyToManyField(
DocVersion, verbose_name=_('Подключенные версии'), blank=True,
related_name='rel_docArts_for_version'
)
# def save(self, not_change_modifiedDT=False, *args, **kwargs):
# if not not_change_modifiedDT:
# self.modifiedDT = datetime.now()
# super().save(*args, **kwargs)
def get_last_child(self, version):
return self.rel_childArts_for_docArt.filter(
versions=version,
enable=True
).order_by('-order').first()
def get_first_child(self, version):
return self.rel_childArts_for_docArt.filter(
versions=version,
enable=True
).order_by('order').first()
def get_last_version(self):
return self.versions.all().order_by('-order').first()
def get_children(self, version):
return self.rel_childArts_for_docArt.filter(enable=True)
def get_prev_article(self, version=None):
if not version:
version = self.get_last_version()
kwargs = {
'enable': True,
'versions': version,
'parent': self.parent
}
if self.order:
kwargs['order__lt'] = self.order
art = DocArt.objects.exclude(
id=self.id
).filter(**kwargs).order_by('-order').first()
if art:
while art.get_last_child(version=version):
art = art.get_last_child(version=version)
if not art and self.parent:
art = self.parent
return art
def get_next_article(self, version=None):
if not version:
version = self.get_last_version()
art = self.get_first_child(version=version)
if not art:
kwargs = {
'enable': True,
'versions': version,
'parent': self.parent
}
if self.order:
kwargs['order__gt'] = self.order
art = DocArt.objects.exclude(
id=self.id
).filter(**kwargs).order_by('order').first()
if not art and self.parent:
art = DocArt.objects.filter(
enable=True,
versions=version,
order__gt=self.parent.order,
parent=self.parent.parent
).order_by('order').first()
return art
def get_parents_path(self, version_obj=None):
res = []
res_ids = []
res.append(self)
res_ids.append(self.id)
obj = self
while obj.parent:
res.insert(0, obj.parent)
res_ids.insert(0, obj.parent.id)
obj = obj.parent
return res, res_ids
def __str__(self):
if self.name:
s = self.name
else:
s = str(self.id)
if self.versions.count():
s += ' - v' + str(' - '.join(item.name for item in self.versions.filter(enable=True)))
return s
class Meta:
verbose_name = _('Статья документации')
verbose_name_plural = _('Статьи документации')
# ordering = ['order', 'name']