137 lines
4.2 KiB
Python
137 lines
4.2 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):
|
|
return self.rel_childArts_for_docArt.filter(enable=True).order_by('-order').first()
|
|
|
|
def get_first_child(self):
|
|
return self.rel_childArts_for_docArt.filter(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()
|
|
|
|
art = DocArt.objects.filter(
|
|
enable=True,
|
|
versions=version,
|
|
order__lt=self.order,
|
|
parent=self.parent
|
|
).order_by('-order').first()
|
|
|
|
if art:
|
|
while art.get_last_child():
|
|
art = art.get_last_child()
|
|
|
|
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()
|
|
if not art:
|
|
art = DocArt.objects.filter(
|
|
enable=True,
|
|
versions=version,
|
|
order__gt=self.order,
|
|
parent=self.parent
|
|
).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'] |