forked from CGM_Public/pretix_original
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:
@@ -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'),
|
||||
|
||||
@@ -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):
|
||||
|
||||
Reference in New Issue
Block a user