from urllib.parse import urlencode from django.urls import reverse from django.utils import timezone from django.utils.translation import gettext, gettext_lazy as _ from django.utils.translation import ngettext 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(gettext("%Y-%m-%d at %H:%M")) count = len(occurrences) return ngettext("%(count)d occurrence", "%(count)d occurrences", count) % {"count": count} 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 = _("Events") menu_order = 1 add_to_admin_menu = True ordering = "-latest_revision_created_at" columns = [ PageTitleColumn("title", label=_("Title"), sort_key="title", classname="title"), EventDateColumn("event_date", label=_("Date"), width="13%"), OrganizersColumn("organizers", label=_("Organizers"), width="12%"), DateColumn( "latest_revision_created_at", label=_("Updated"), sort_key="latest_revision_created_at", width="10%", ), PageStatusColumn("status", label=_("Status"), sort_key="live", width="10%"), ] event_page_listing_viewset = EventPageListingViewSet("events")