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']