From 40c8d014dfba6e97af0ad40d0b7f4abfd087082a Mon Sep 17 00:00:00 2001 From: Raphael Michel Date: Mon, 14 Oct 2024 09:26:06 +0200 Subject: [PATCH] Waiting list: Redirect to shop if no products can be awaited (Z#23168172) (#4517) * Waiting list: Redirect to shop if no products can be awaited (Z#23168172) * Update src/pretix/presale/views/waiting.py Co-authored-by: Mira --------- Co-authored-by: Mira --- src/pretix/presale/forms/waitinglist.py | 36 +++------------------ src/pretix/presale/views/waiting.py | 43 +++++++++++++++++++++++-- 2 files changed, 45 insertions(+), 34 deletions(-) diff --git a/src/pretix/presale/forms/waitinglist.py b/src/pretix/presale/forms/waitinglist.py index 785bcdb34..c2d545ed6 100644 --- a/src/pretix/presale/forms/waitinglist.py +++ b/src/pretix/presale/forms/waitinglist.py @@ -28,9 +28,8 @@ from pretix.base.forms.questions import ( NamePartsFormField, WrappedPhoneNumberPrefixWidget, guess_phone_prefix_from_request, ) -from pretix.base.models import Quota, WaitingListEntry +from pretix.base.models import WaitingListEntry from pretix.base.templatetags.rich_text import rich_text -from pretix.presale.views.event import get_grouped_items class WaitingListForm(forms.ModelForm): @@ -43,40 +42,13 @@ class WaitingListForm(forms.ModelForm): def __init__(self, *args, **kwargs): request = kwargs.pop('request') self.event = kwargs.pop('event') - self.channel = kwargs.pop('channel') - customer = kwargs.pop('customer') + itemvars = kwargs.pop('itemvars') super().__init__(*args, **kwargs) choices = [ - ('', '') + ('', ''), + *itemvars, ] - items, display_add_to_cart = get_grouped_items( - self.event, - subevent=self.instance.subevent, - require_seat=None, - channel=self.event.organizer.sales_channels.get(identifier="web"), - memberships=( - customer.usable_memberships( - for_event=self.instance.subevent or self.event, - testmode=self.event.testmode - ) - if customer else None - ), - ) - for i in items: - if not i.allow_waitinglist: - continue - - if i.has_variations: - for v in i.available_variations: - if v.cached_availability[0] == Quota.AVAILABILITY_OK: - continue - choices.append((f'{i.pk}-{v.pk}', f'{i.name} – {v.value}')) - - else: - if i.cached_availability[0] == Quota.AVAILABILITY_OK: - continue - choices.append((f'{i.pk}', f'{i.name}')) self.fields['itemvar'] = forms.ChoiceField( label=_('Product'), diff --git a/src/pretix/presale/views/waiting.py b/src/pretix/presale/views/waiting.py index 5f8b51a3b..4b0b7e79b 100644 --- a/src/pretix/presale/views/waiting.py +++ b/src/pretix/presale/views/waiting.py @@ -27,6 +27,7 @@ from django.db import transaction from django.http import Http404 from django.shortcuts import get_object_or_404, redirect, render from django.utils.decorators import method_decorator +from django.utils.functional import cached_property from django.utils.timezone import now from django.utils.translation import gettext_lazy as _, pgettext_lazy from django.views.generic import FormView, TemplateView @@ -40,6 +41,7 @@ from ...base.i18n import get_language_without_region from ...base.models import Voucher, WaitingListEntry from ..forms.waitinglist import WaitingListForm from . import allow_frame_if_namespaced +from .event import get_grouped_items @method_decorator(allow_frame_if_namespaced, 'dispatch') @@ -48,6 +50,39 @@ class WaitingView(EventViewMixin, FormView): template_name = 'pretixpresale/event/waitinglist.html' form_class = WaitingListForm + @cached_property + def itemvars(self): + customer = getattr(self.request, 'customer', None) + items, display_add_to_cart = get_grouped_items( + self.request.event, + subevent=self.subevent, + require_seat=None, + channel=self.request.organizer.sales_channels.get(identifier="web"), + memberships=( + customer.usable_memberships( + for_event=self.subevent or self.request.event, + testmode=self.request.event.testmode + ) + if customer else None + ), + ) + choices = [] + for i in items: + if not i.allow_waitinglist: + continue + + if i.has_variations: + for v in i.available_variations: + if v.cached_availability[0] == Quota.AVAILABILITY_OK: + continue + choices.append((f'{i.pk}-{v.pk}', f'{i.name} – {v.value}')) + + else: + if i.cached_availability[0] == Quota.AVAILABILITY_OK: + continue + choices.append((f'{i.pk}', f'{i.name}')) + return choices + def get_form_kwargs(self): kwargs = super().get_form_kwargs() kwargs['request'] = self.request @@ -56,8 +91,7 @@ class WaitingView(EventViewMixin, FormView): event=self.request.event, locale=get_language_without_region(), subevent=self.subevent ) - kwargs['channel'] = self.request.sales_channel.identifier - kwargs['customer'] = getattr(self.request, 'customer', None) + kwargs['itemvars'] = self.itemvars kwargs.setdefault('initial', {}) if 'var' in self.request.GET: kwargs['initial']['itemvar'] = f'{self.request.GET.get("item")}-{self.request.GET.get("var")}' @@ -89,6 +123,11 @@ class WaitingView(EventViewMixin, FormView): r._csp_ignore = True return r + if not self.itemvars: + messages.info(request, _("No ticket types are available for the waiting list, have a look at the " + "ticket shop instead.")) + return redirect(self.get_index_url()) + return super().get(request, *args, **kwargs) def dispatch(self, request, *args, **kwargs):