from django.contrib import admin from sets.admin import * from .models import * from BaseModels.admin_utils import Admin_BaseIconModel 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 from django.contrib import messages class DocArtForm(forms.ModelForm): class Meta: model = DocArt fields = '__all__' def __init__(self, *args, **kwargs): super(DocArtForm, self).__init__(*args, **kwargs) self.fields['parent'].queryset = DocArt.objects.exclude(id__exact=self.instance.id) def make_assign_versions_action(version): def assign_to_version(modeladmin, request, queryset): for art in queryset: if version not in art.versions.all(): art.versions.add(version) # Method on Order model messages.info(request, f"Статье {art} назначена версия {version.name}") assign_to_version.short_description = _(f"Назначить версию {version.name}") # We need a different '__name__' for each action - Django # uses this as a key in the drop-down box. assign_to_version.__name__ = _(f"Назначить версию {version.name}") return assign_to_version class Admin_DocArt(SuperModelAdmin, Admin_Trans_BaseModelViewPage): form = DocArtForm def show_versions(self, obj): versions = obj.versions.filter(enable=True).values_list('name', flat=True) if versions: return ' - '.join(versions) 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, { 'classes': ['wide'], 'fields': ( 'name', 'url', 'enable', 'parent', 'versions', 'order', # 'title', # 'description', 'text', # 'picture', ) }), # ('SEO', { # 'classes': ['wide', 'collapse'], # 'fields': ( # 'seo_title', 'seo_description', 'seo_keywords', 'seo_text', # ) # }), ] list_display = [ 'id', 'enable', 'name', 'url', 'show_versions', # 'versions', 'parent', 'order', 'modifiedDT', 'createDT' ] # ordering = [ # # 'versions', # 'order', 'name'] prepopulated_fields = {"url": ("name_en",)} list_display_links = ['id', 'name'] list_editable = ['enable', 'order'] filter_horizontal = ['versions'] list_filter = [ 'versions', 'modifiedDT', 'createDT', ] search_fields = ['name', 'title'] # filter_horizontal = ['options'] # inlines = [Admin_StackedInline_Block] actions = ["create_copy_arts"] def get_actions(self, request): actions = super(Admin_DocArt, self).get_actions(request) versions = DocVersion.objects.filter(enable=True) for version in versions: action = make_assign_versions_action(version) actions[action.__name__] = (action, action.__name__, action.short_description) return actions @admin.action(description=_("Создать копии выбранных статей")) def create_copy_arts(self, request, queryset): 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() self.message_user( request, _('Копии успешно созданы') ) admin.site.register(DocArt, Admin_DocArt) class Admin_DocVersion(Admin_BaseIconModel): fieldsets = [ (None, { 'classes': ['wide'], 'fields': ( 'name', 'url', 'enable', 'order', ) }), # ('SEO', { # 'classes': ['wide', 'collapse'], # 'fields': ( # 'seo_title', 'seo_description', 'seo_keywords', 'seo_text', # ) # }), ] list_display = [ 'id', 'enable', 'name', 'url', # 'title', 'order', 'modifiedDT', 'createDT' ] # ordering = ['section', 'parent_service', 'order'] # prepopulated_fields = {"url": ("name",)} list_display_links = ['id', 'name'] list_editable = ['enable', 'order'] list_filter = [ # 'section', 'parent_service', 'modifiedDT', 'createDT', ] search_fields = ['name'] # filter_horizontal = ['options'] # inlines = [Admin_StackedInline_Block] admin.site.register(DocVersion, Admin_DocVersion)