dnscms: improve events listing view

This commit is contained in:
2026-05-19 20:35:46 +02:00
parent 1073adacbb
commit 6a9fff8917
4 changed files with 150 additions and 11 deletions
+86
View File
@@ -0,0 +1,86 @@
from urllib.parse import urlencode
from django.urls import reverse
from django.utils import timezone
from wagtail.admin.ui.tables import Column, DateColumn
from wagtail.admin.ui.tables.pages import PageStatusColumn, PageTitleColumn
from wagtail.admin.views.pages.choose_parent import ChooseParentView
from wagtail.admin.views.pages.listing import IndexView
from wagtail.admin.viewsets.pages import PageListingViewSet
from events.models import EventPage
class EventDateColumn(Column):
def get_value(self, instance):
occurrences = list(instance.occurrences.order_by("start"))
if not occurrences:
return ""
if len(occurrences) == 1:
local = timezone.localtime(occurrences[0].start)
return local.strftime("%Y-%m-%d kl %H:%M")
return f"{len(occurrences)} forekomster"
class OrganizersColumn(Column):
def get_value(self, instance):
names = list(instance.organizers.values_list("name", flat=True))
if not names:
return ""
if len(names) == 1:
return names[0]
return f"{names[0]} (+{len(names) - 1})"
class EventPageIndexView(IndexView):
def annotate_queryset(self, pages):
pages = super().annotate_queryset(pages)
return pages.prefetch_related(
"occurrences",
"organizer_links__organizer",
)
class EventChooseParentView(ChooseParentView):
"""Redirect newly-created EventPages back to the events listing."""
def _with_next(self, response):
if response.status_code != 302:
return response
url = response["Location"]
sep = "&" if "?" in url else "?"
response["Location"] = f"{url}{sep}{urlencode({'next': reverse('events:index')})}"
return response
def get(self, request, *args, **kwargs):
return self._with_next(super().get(request, *args, **kwargs))
def form_valid(self, form):
return self._with_next(super().form_valid(form))
class EventPageListingViewSet(PageListingViewSet):
model = EventPage
index_view_class = EventPageIndexView
choose_parent_view_class = EventChooseParentView
icon = "date"
menu_label = "Arrangementer"
menu_order = 1
add_to_admin_menu = True
ordering = "-latest_revision_created_at"
columns = [
PageTitleColumn("title", label="Tittel", sort_key="title", classname="title"),
EventDateColumn("event_date", label="Dato", width="13%"),
OrganizersColumn("organizers", label="Arrangører", width="12%"),
DateColumn(
"latest_revision_created_at",
label="Oppdatert",
sort_key="latest_revision_created_at",
width="10%",
),
PageStatusColumn("status", label="Status", sort_key="live", width="10%"),
]
event_page_listing_viewset = EventPageListingViewSet("events")
+6
View File
@@ -1,8 +1,14 @@
from wagtail import hooks
from .admin import event_page_listing_viewset
from .views import event_organizer_chooser_viewset
@hooks.register("register_admin_viewset")
def register_viewset():
return event_organizer_chooser_viewset
@hooks.register("register_admin_viewset")
def register_event_page_listing_viewset():
return event_page_listing_viewset