87 lines
2.8 KiB
Python
87 lines
2.8 KiB
Python
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")
|