from copy import deepcopy from adminsortable2.admin import SortableInlineAdminMixin from django.contrib import admin from django.http import QueryDict from django.utils.safestring import mark_safe from django.utils.translation import gettext_lazy as _ from ..models import Category, Comment, NavItem, Page, StaticPage __all__ = ("CategoryAdmin", "PageAdmin", "NavItemInline") @admin.register(Category) class CategoryAdmin(admin.ModelAdmin): list_display = ["pk", "title", "slug"] list_editable = ["title", "slug"] search_fields = ["title"] fields = ["title", "slug"] prepopulated_fields = {"slug": ("title",)} ordering = ("title",) class BasePageAdmin(admin.ModelAdmin): list_display = ("cover_thumb", "title", "status") list_display_links = ("cover_thumb", "title") list_editable = ("status",) list_filter = ("status",) prepopulated_fields = {"slug": ("title",)} # prepopulate fields using changelist's filters prepopulated_filters = ("parent",) search_fields = ("title",) fieldsets = [ ( "", { "fields": ["title", "slug", "cover", "content"], }, ), ( _("Publication Settings"), { "fields": [ "status", ], }, ), ] def cover_thumb(self, obj): if obj.cover and obj.cover.thumbnails: return mark_safe(''.format(obj.cover.icons["64"])) return "" def _get_extra_context(self, query, **extra_context): return extra_context def add_view(self, request, form_url="", extra_context=None): filters = QueryDict(request.GET.get("_changelist_filters", "")) extra_context = self._get_extra_context(filters, **(extra_context or {})) return super().add_view(request, form_url, extra_context) def changelist_view(self, request, extra_context=None): extra_context = self._get_extra_context(request.GET, **(extra_context or {})) return super().changelist_view(request, extra_context) @admin.register(Page) class PageAdmin(BasePageAdmin): list_display = BasePageAdmin.list_display + ("category",) list_editable = BasePageAdmin.list_editable + ("category",) list_filter = BasePageAdmin.list_filter + ("category", "pub_date") search_fields = BasePageAdmin.search_fields + ("category__title",) fieldsets = deepcopy(BasePageAdmin.fieldsets) fieldsets[0][1]["fields"].insert(fieldsets[0][1]["fields"].index("slug") + 1, "category") fieldsets[1][1]["fields"] += ("featured", "allow_comments") class ChildPageAdmin(PageAdmin): list_display = PageAdmin.list_display + ("parent",) autocomplete_fields = ("parent",) fieldsets = deepcopy(PageAdmin.fieldsets) fieldsets[1][1]["fields"] += ("parent",) def get_changeform_initial_data(self, request): data = super().get_changeform_initial_data(request) filters = QueryDict(request.GET.get("_changelist_filters", "")) data["parent"] = filters.get("parent", None) return data def _get_extra_context(self, query, **extra_context): parent = query.get("parent", None) extra_context["parent"] = None if parent is None else Page.objects.get_subclass(id=parent) return super()._get_extra_context(query, **extra_context) def render_change_form(self, request, context, *args, **kwargs): if context["original"] and "parent" not in context: context["parent"] = context["original"].parent return super().render_change_form(request, context, *args, **kwargs) @admin.register(StaticPage) class StaticPageAdmin(BasePageAdmin): list_display = BasePageAdmin.list_display + ("attach_to",) list_editable = BasePageAdmin.list_editable + ("attach_to",) fieldsets = deepcopy(BasePageAdmin.fieldsets) fieldsets[1][1]["fields"] += ("attach_to",) @admin.register(Comment) class CommentAdmin(admin.ModelAdmin): list_display = ("page_title", "date", "nickname") list_filter = ("date",) search_fields = ("page__title", "nickname") readonly_fields = ("page",) def page_title(self, obj): return obj.page.title class NavItemInline(SortableInlineAdminMixin, admin.TabularInline): model = NavItem