diff --git a/DocsApp/admin.py b/DocsApp/admin.py index 28400f6..a5b162e 100644 --- a/DocsApp/admin.py +++ b/DocsApp/admin.py @@ -6,7 +6,7 @@ from super_inlines.admin import SuperInlineModelAdmin, SuperModelAdmin from django.utils.translation import gettext as _ from django import forms from django.utils.text import slugify - +from django.db.models import Min class DocArtForm(forms.ModelForm): @@ -29,6 +29,14 @@ class Admin_DocArt(SuperModelAdmin, Admin_Trans_BaseModelViewPage): return '-' show_versions.short_description = _('Версии') + def get_queryset(self, request): + queryset = super().get_queryset(request) + queryset = queryset.annotate( + min_version_order=Min('versions__order'), + max_version_name=Min('versions__name'), + ).order_by('min_version_order', 'max_version_name', 'order').distinct() + return queryset + fieldsets = [ (None, { @@ -58,11 +66,15 @@ class Admin_DocArt(SuperModelAdmin, Admin_Trans_BaseModelViewPage): list_display = [ 'id', 'enable', 'name', 'url', - 'show_versions', 'parent', + 'show_versions', + # 'versions', + 'parent', 'order', 'modifiedDT', 'createDT' ] - ordering = ['versions', 'order', 'name'] + # ordering = [ + # # 'versions', + # 'order', 'name'] prepopulated_fields = {"url": ("name_en",)} @@ -86,6 +98,7 @@ class Admin_DocArt(SuperModelAdmin, Admin_Trans_BaseModelViewPage): from BaseModels.functions import create_url for obj in queryset: obj.name += '-копия' + obj.parent = None obj.url = create_url({'name': obj.name}, DocArt) obj.pk = None obj.save() diff --git a/DocsApp/models.py b/DocsApp/models.py index dc119a5..6c807a8 100644 --- a/DocsApp/models.py +++ b/DocsApp/models.py @@ -28,6 +28,7 @@ class DocVersion(BaseModel): class Meta: verbose_name = _('Версия документации') verbose_name_plural = _('Версии документации') + ordering = ['order', 'name'] class DocArt(BaseModelViewPage): @@ -42,11 +43,33 @@ class DocArt(BaseModelViewPage): related_name='rel_docArts_for_version' ) + 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: - return self.name + s = self.name else: - return str(self.id) + 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 = _('Статьи документации') \ No newline at end of file + verbose_name_plural = _('Статьи документации') + # ordering = ['order', 'name'] \ No newline at end of file diff --git a/DocsApp/views.py b/DocsApp/views.py index c5d1902..bd58338 100644 --- a/DocsApp/views.py +++ b/DocsApp/views.py @@ -11,14 +11,15 @@ from django.urls import reverse from collections import OrderedDict -def get_tree_arts(art, arts): +def get_tree_arts(art, arts, sel_arts_ids): docs_tree = OrderedDict() docs_tree.update({ art_item.name: { 'url': art_item.url, 'id': art_item.id, - 'children': get_tree_arts(art_item, arts), + 'children': get_tree_arts(art_item, arts, sel_arts_ids), + 'active': art_item.id in sel_arts_ids } for art_item in arts.filter(parent=art) }) return docs_tree @@ -52,14 +53,15 @@ def DocsView(request, version=None, art_url=None): except DocVersion.DoesNotExist: raise Http404 + active_arts, active_arts_ids = art.get_parents_path() arts = DocArt.objects.filter(enable=True, versions=vers_obj).order_by('order') - doc_tree = get_tree_arts(None, arts) + doc_tree = get_tree_arts(None, arts, active_arts_ids) Dict = { 'cur_article': art, 'cur_version': vers_obj, - 'doc_tree': doc_tree + 'doc_tree': doc_tree, } t = loader.get_template('pages/p_documentation.html') return get_inter_http_respose(t, Dict, request)