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 <weller@rami.io>

---------

Co-authored-by: Mira <weller@rami.io>
This commit is contained in:
Raphael Michel
2024-10-14 09:26:06 +02:00
committed by GitHub
parent c10efc692d
commit 40c8d014df
2 changed files with 45 additions and 34 deletions

View File

@@ -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'),

View File

@@ -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):