From e226bfb8d5af5f77b211fb48bc7b4af4ab6e9fb5 Mon Sep 17 00:00:00 2001 From: Lukas Bockstaller Date: Wed, 17 Dec 2025 17:14:08 +0100 Subject: [PATCH] combine edit.html and transfer.html --- src/pretix/control/forms/waitinglist.py | 61 +++++++++---------- .../pretixcontrol/waitinglist/edit.html | 26 -------- .../pretixcontrol/waitinglist/index.html | 15 +++-- .../pretixcontrol/waitinglist/transfer.html | 19 +++++- src/pretix/control/urls.py | 2 - src/pretix/control/views/waitinglist.py | 49 ++------------- 6 files changed, 56 insertions(+), 116 deletions(-) delete mode 100644 src/pretix/control/templates/pretixcontrol/waitinglist/edit.html diff --git a/src/pretix/control/forms/waitinglist.py b/src/pretix/control/forms/waitinglist.py index c3a9317fc..07fd69645 100644 --- a/src/pretix/control/forms/waitinglist.py +++ b/src/pretix/control/forms/waitinglist.py @@ -34,8 +34,18 @@ from pretix.control.forms.widgets import Select2, Select2ItemVarQuota class WaitingListEntryTransferForm(I18nModelForm): + itemvar = ChoiceField() def __init__(self, *args, **kwargs): + self.instance = kwargs.get('instance', None) + initial = kwargs.get('initial', {}) + if self.instance and self.instance.pk and 'itemvar' not in initial: + if self.instance.variation is not None: + initial['itemvar'] = f'{self.instance.item.pk}-{self.instance.variation.pk}' + else: + initial['itemvar'] = self.instance.item.pk + kwargs['initial'] = initial + super().__init__(*args, **kwargs) if self.event.has_subevents: @@ -51,34 +61,8 @@ class WaitingListEntryTransferForm(I18nModelForm): } ) self.fields['subevent'].widget.choices = self.fields['subevent'].choices - - class Meta: - model = WaitingListEntry - fields = [ - 'subevent', - ] - field_classes = { - 'subevent': SafeModelChoiceField, - } - - -class WaitingListEntryEditForm(I18nModelForm): - itemvar = ChoiceField() - - def __init__(self, *args, **kwargs): - self.instance = kwargs.get('instance', None) - initial = kwargs.get('initial', {}) - if self.instance and self.instance.pk and 'itemvar' not in initial: - if self.instance.variation is not None: - initial['itemvar'] = f'{self.instance.item.pk}-{self.instance.variation.pk}' - else: - initial['itemvar'] = self.instance.item.pk - kwargs['initial'] = initial - - super().__init__(*args, **kwargs) - - # Prevent the item field cleaning from complaining that it isn't populated - # the value for item is derived and populated during form.clean() + else: + del self.fields['subevent'] if self.event.settings.waiting_list_names_asked: self.fields['name_parts'] = NamePartsFormField( @@ -96,11 +80,11 @@ class WaitingListEntryEditForm(I18nModelForm): choices = [] - items = self.event.items.prefetch_related('variations') - + items = self.event.items.prefetch_related('variations').prefetch_related('quotas') for item in items: - if not item.allow_waitinglist: + if not item.allow_waitinglist | item.quotas.exists(): continue + if len(item.variations.all()) > 0: for v in item.variations.all(): choices.append(( @@ -128,8 +112,10 @@ class WaitingListEntryEditForm(I18nModelForm): self.fields['itemvar'].choices = choices def clean(self): - itemvar = self.data.get('itemvar') + if self.instance.voucher is not None: + self.add_error(None, _('A voucher for this waiting list entry was sent out already.')) + itemvar = self.data.get('itemvar') if itemvar is None: self.add_error('itemvar', _('Item and Variation are required')) else: @@ -137,6 +123,14 @@ class WaitingListEntryEditForm(I18nModelForm): if '-' in itemvar: self.instance.variation = ItemVariation.objects.get(pk=itemvar.split('-')[1]) + if not self.instance.item.allow_waitinglist: + self.add_error('itemvar', _('The selected product does not allow waiting list entries.')) + + if self.instance.item and not self.instance.item.quotas.filter(subevent=self.data.get('subevent')).exists(): + self.add_error('itemvar', _('The selected product is not on sale because there is no quota configured for it.')) + if self.instance.variation and not self.instance.variation.quotas.filter(subevent=self.data.get('subevent')).exists(): + self.add_error('itemvar', _('The selected product is not on sale because there is no quota configured for it.')) + data = super().clean() return data @@ -146,13 +140,14 @@ class WaitingListEntryEditForm(I18nModelForm): 'email', 'name_parts', 'phone', + 'subevent', ] field_classes = { + 'subevent': SafeModelChoiceField, 'email': EmailField, 'phone': PhoneNumberField, } exclude = [ - 'subevent', # handled by EntryTransfer view 'voucher', # handled by the assign operation in the WaitingListActionView 'priority' # handled via thumbs up/down ] diff --git a/src/pretix/control/templates/pretixcontrol/waitinglist/edit.html b/src/pretix/control/templates/pretixcontrol/waitinglist/edit.html deleted file mode 100644 index 889ec67b6..000000000 --- a/src/pretix/control/templates/pretixcontrol/waitinglist/edit.html +++ /dev/null @@ -1,26 +0,0 @@ -{% extends "pretixcontrol/event/base.html" %} -{% load i18n %} -{% load bootstrap3 %} -{% block title %}{% trans "Edit waiting list entry" %}{% endblock %} -{% block content %} -

{% trans "Edit waiting list entry" %}

-
- {% csrf_token %} - - {% bootstrap_field form.email layout="control" %} - - {% if form.phone %} - {% bootstrap_field form.name_parts layout="control" %} - {% endif %} - - {% if form.phone %} - {% bootstrap_field form.phone layout="control" %} - {% endif %} - {% bootstrap_field form.itemvar layout="control" %} -
- -
-
-{% endblock %} diff --git a/src/pretix/control/templates/pretixcontrol/waitinglist/index.html b/src/pretix/control/templates/pretixcontrol/waitinglist/index.html index ae4ae707c..a0546c7b3 100644 --- a/src/pretix/control/templates/pretixcontrol/waitinglist/index.html +++ b/src/pretix/control/templates/pretixcontrol/waitinglist/index.html @@ -268,14 +268,13 @@ data-toggle="tooltip" title="{% trans "Move to the end of the list" %}"> - {% if request.event.has_subevents %} - - - - {% endif %} - + + + + + {% else %}