aircox-radiocampus/aircox/admin/page.py
Chris Tactic 55123c386d #132 | #121: backoffice / dev-1.0-121 (#131)
cfr #121

Co-authored-by: Christophe Siraut <d@tobald.eu.org>
Co-authored-by: bkfox <thomas bkfox net>
Co-authored-by: Thomas Kairos <thomas@bkfox.net>
Reviewed-on: rc/aircox#131
Co-authored-by: Chris Tactic <ctactic@noreply.git.radiocampus.be>
Co-committed-by: Chris Tactic <ctactic@noreply.git.radiocampus.be>
2024-04-28 22:02:09 +02:00

128 lines
4.2 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",)}
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('<img src="{}"/>'.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