aircox/aircox/admin/page.py
Thomas Kairos f7a61fe6c0 Feat: packaging (#127)
- Add configuration files for packaging
- Precommit now uses ruff

Co-authored-by: bkfox <thomas bkfox net>
Reviewed-on: #127
2023-10-11 10:58:34 +02:00

115 lines
3.9 KiB
Python

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",)}
class BasePageAdmin(admin.ModelAdmin):
list_display = ("cover_thumb", "title", "status", "parent")
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", "parent"],
},
),
]
change_form_template = "admin/aircox/page_change_form.html"
def cover_thumb(self, obj):
return mark_safe('<img src="{}"/>'.format(obj.cover.icons["64"])) if obj.cover else ""
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_common_context(self, query, extra_context=None):
extra_context = extra_context or {}
parent = query.get("parent", None)
extra_context["parent"] = None if parent is None else Page.objects.get_subclass(id=parent)
return 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)
def add_view(self, request, form_url="", extra_context=None):
filters = QueryDict(request.GET.get("_changelist_filters", ""))
extra_context = self._get_common_context(filters, extra_context)
return super().add_view(request, form_url, extra_context)
def changelist_view(self, request, extra_context=None):
extra_context = self._get_common_context(request.GET, extra_context)
return super().changelist_view(request, extra_context)
class PageAdmin(BasePageAdmin):
change_list_template = "admin/aircox/page_change_list.html"
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")
@admin.register(StaticPage)
class StaticPageAdmin(BasePageAdmin):
list_display = BasePageAdmin.list_display + ("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")
def page_title(self, obj):
return obj.page.title
class NavItemInline(SortableInlineAdminMixin, admin.TabularInline):
model = NavItem