mirror of
https://github.com/pretix/pretix.git
synced 2026-05-07 15:34:02 +00:00
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,
|
NamePartsFormField, WrappedPhoneNumberPrefixWidget,
|
||||||
guess_phone_prefix_from_request,
|
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.base.templatetags.rich_text import rich_text
|
||||||
from pretix.presale.views.event import get_grouped_items
|
|
||||||
|
|
||||||
|
|
||||||
class WaitingListForm(forms.ModelForm):
|
class WaitingListForm(forms.ModelForm):
|
||||||
@@ -43,40 +42,13 @@ class WaitingListForm(forms.ModelForm):
|
|||||||
def __init__(self, *args, **kwargs):
|
def __init__(self, *args, **kwargs):
|
||||||
request = kwargs.pop('request')
|
request = kwargs.pop('request')
|
||||||
self.event = kwargs.pop('event')
|
self.event = kwargs.pop('event')
|
||||||
self.channel = kwargs.pop('channel')
|
itemvars = kwargs.pop('itemvars')
|
||||||
customer = kwargs.pop('customer')
|
|
||||||
super().__init__(*args, **kwargs)
|
super().__init__(*args, **kwargs)
|
||||||
|
|
||||||
choices = [
|
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(
|
self.fields['itemvar'] = forms.ChoiceField(
|
||||||
label=_('Product'),
|
label=_('Product'),
|
||||||
|
|||||||
@@ -27,6 +27,7 @@ from django.db import transaction
|
|||||||
from django.http import Http404
|
from django.http import Http404
|
||||||
from django.shortcuts import get_object_or_404, redirect, render
|
from django.shortcuts import get_object_or_404, redirect, render
|
||||||
from django.utils.decorators import method_decorator
|
from django.utils.decorators import method_decorator
|
||||||
|
from django.utils.functional import cached_property
|
||||||
from django.utils.timezone import now
|
from django.utils.timezone import now
|
||||||
from django.utils.translation import gettext_lazy as _, pgettext_lazy
|
from django.utils.translation import gettext_lazy as _, pgettext_lazy
|
||||||
from django.views.generic import FormView, TemplateView
|
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 ...base.models import Voucher, WaitingListEntry
|
||||||
from ..forms.waitinglist import WaitingListForm
|
from ..forms.waitinglist import WaitingListForm
|
||||||
from . import allow_frame_if_namespaced
|
from . import allow_frame_if_namespaced
|
||||||
|
from .event import get_grouped_items
|
||||||
|
|
||||||
|
|
||||||
@method_decorator(allow_frame_if_namespaced, 'dispatch')
|
@method_decorator(allow_frame_if_namespaced, 'dispatch')
|
||||||
@@ -48,6 +50,39 @@ class WaitingView(EventViewMixin, FormView):
|
|||||||
template_name = 'pretixpresale/event/waitinglist.html'
|
template_name = 'pretixpresale/event/waitinglist.html'
|
||||||
form_class = WaitingListForm
|
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):
|
def get_form_kwargs(self):
|
||||||
kwargs = super().get_form_kwargs()
|
kwargs = super().get_form_kwargs()
|
||||||
kwargs['request'] = self.request
|
kwargs['request'] = self.request
|
||||||
@@ -56,8 +91,7 @@ class WaitingView(EventViewMixin, FormView):
|
|||||||
event=self.request.event, locale=get_language_without_region(),
|
event=self.request.event, locale=get_language_without_region(),
|
||||||
subevent=self.subevent
|
subevent=self.subevent
|
||||||
)
|
)
|
||||||
kwargs['channel'] = self.request.sales_channel.identifier
|
kwargs['itemvars'] = self.itemvars
|
||||||
kwargs['customer'] = getattr(self.request, 'customer', None)
|
|
||||||
kwargs.setdefault('initial', {})
|
kwargs.setdefault('initial', {})
|
||||||
if 'var' in self.request.GET:
|
if 'var' in self.request.GET:
|
||||||
kwargs['initial']['itemvar'] = f'{self.request.GET.get("item")}-{self.request.GET.get("var")}'
|
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
|
r._csp_ignore = True
|
||||||
return r
|
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)
|
return super().get(request, *args, **kwargs)
|
||||||
|
|
||||||
def dispatch(self, request, *args, **kwargs):
|
def dispatch(self, request, *args, **kwargs):
|
||||||
|
|||||||
Reference in New Issue
Block a user