Allow plugins to filter subevents in the public calendar (#5457)

* Allow plugins to filter subevents in the public calendar

* Add to docs

* Review notes
This commit is contained in:
Raphael Michel
2025-09-11 19:40:10 +02:00
committed by GitHub
parent b3974067a5
commit ed9250c522
5 changed files with 210 additions and 84 deletions

View File

@@ -85,7 +85,8 @@ from pretix.presale.ical import get_public_ical
from pretix.presale.signals import item_description, seatingframe_html_head
from pretix.presale.views.organizer import (
EventListMixin, add_subevents_for_days, days_for_template,
filter_qs_by_attr, has_before_after, weeks_for_template,
filter_qs_by_attr, filter_subevents_with_plugins, has_before_after,
weeks_for_template,
)
from . import (
@@ -546,6 +547,12 @@ class EventIndex(EventViewMixin, EventListMixin, CartMixin, TemplateView):
self.subevent = request.event.subevents.using(settings.DATABASE_REPLICA).filter(pk=kwargs['subevent'], active=True).first()
if not self.subevent:
raise Http404()
# Prevent direct access to subevents that are hidden by a plugin
subevents = filter_subevents_with_plugins([self.subevent], self.request.sales_channel)
if self.subevent not in subevents:
raise Http404()
return super().get(request, *args, **kwargs)
else:
return super().get(request, *args, **kwargs)
@@ -703,9 +710,14 @@ class EventIndex(EventViewMixin, EventListMixin, CartMixin, TemplateView):
).using(settings.DATABASE_REPLICA),
self.request
),
limit_before, after, ebd, set(), self.request.event,
self.kwargs.get('cart_namespace'),
voucher,
before=limit_before,
after=after,
ebd=ebd,
timezones=set(),
event=self.request.event,
cart_namespace=self.kwargs.get('cart_namespace'),
voucher=voucher,
sales_channel=self.request.sales_channel,
)
# Hide names of subevents in event series where it is always the same. No need to show the name of the museum thousands of times
@@ -762,9 +774,14 @@ class EventIndex(EventViewMixin, EventListMixin, CartMixin, TemplateView):
).using(settings.DATABASE_REPLICA),
self.request
),
limit_before, after, ebd, set(), self.request.event,
self.kwargs.get('cart_namespace'),
voucher,
before=limit_before,
after=after,
ebd=ebd,
timezones=set(),
event=self.request.event,
cart_namespace=self.kwargs.get('cart_namespace'),
voucher=voucher,
sales_channel=self.request.sales_channel,
)
# Hide names of subevents in event series where it is always the same. No need to show the name of the museum thousands of times
@@ -803,7 +820,7 @@ class EventIndex(EventViewMixin, EventListMixin, CartMixin, TemplateView):
future_only=self.request.event.settings.event_calendar_future_only
)
else:
context['subevent_list'] = self.request.event.subevents_sorted(
subevents = self.request.event.subevents_sorted(
filter_qs_by_attr(
self.request.event.subevents_annotated(
self.request.sales_channel,
@@ -812,12 +829,14 @@ class EventIndex(EventViewMixin, EventListMixin, CartMixin, TemplateView):
self.request
)
)
subevents = filter_subevents_with_plugins(list(subevents), self.request.sales_channel)
context['subevent_list'] = subevents
if self.request.event.settings.event_list_available_only and not voucher:
context['subevent_list'] = [
se for se in context['subevent_list']
se for se in subevents
if not se.presale_has_ended and (se.best_availability_state is None or se.best_availability_state >= Quota.AVAILABILITY_RESERVED)
]
context['visible_events'] = len(context['subevent_list']) > 0
context['visible_events'] = len(subevents) > 0
return context