From 1f38a657150b6b260c48af0122076f3d9dd929a9 Mon Sep 17 00:00:00 2001 From: Lukas Bockstaller Date: Tue, 9 Dec 2025 11:25:37 +0100 Subject: [PATCH] move form to form/item.py --- src/pretix/control/forms/item.py | 66 ++++++++++++++++++++++++++++- src/pretix/control/views/item.py | 73 +++----------------------------- 2 files changed, 70 insertions(+), 69 deletions(-) diff --git a/src/pretix/control/forms/item.py b/src/pretix/control/forms/item.py index 6d5b8f1797..a758ace068 100644 --- a/src/pretix/control/forms/item.py +++ b/src/pretix/control/forms/item.py @@ -47,7 +47,9 @@ from django.urls import reverse from django.utils.functional import cached_property from django.utils.html import escape, format_html from django.utils.safestring import mark_safe -from django.utils.translation import gettext as __, gettext_lazy as _ +from django.utils.translation import ( + gettext as __, gettext_lazy as _, pgettext_lazy, +) from django_scopes.forms import ( SafeModelChoiceField, SafeModelMultipleChoiceField, ) @@ -57,7 +59,7 @@ from pretix.base.forms import I18nFormSet, I18nMarkdownTextarea, I18nModelForm from pretix.base.forms.widgets import DatePickerWidget from pretix.base.models import ( Item, ItemCategory, ItemProgramTime, ItemVariation, Question, - QuestionOption, Quota, + QuestionOption, Quota, SubEvent, ) from pretix.base.models.items import ItemAddOn, ItemBundle, ItemMetaValue from pretix.base.signals import item_copy_data @@ -272,6 +274,66 @@ class QuestionOptionForm(I18nModelForm): ] +class QuestionFilterForm(forms.Form): + STATUS_VARIANTS = [ + ("", _("All orders")), + ("p", _("Paid")), + ("pv", _("Paid or confirmed")), + ("n", _("Pending")), + ("np", _("Pending or paid")), + ("o", _("Pending (overdue)")), + ("e", _("Expired")), + ("ne", _("Pending or expired")), + ("c", _("Canceled")) + ] + + status = forms.ChoiceField( + choices=STATUS_VARIANTS, + widget=forms.Select( + attrs={ + 'class': 'form-control', + } + ), + required=False, + ) + item = forms.ChoiceField( + choices=[], + widget=forms.Select( + attrs={'class': 'form-control'} + ), + required=False + ) + subevent = forms.ModelChoiceField( + queryset=SubEvent.objects.none(), + required=False, + empty_label=pgettext_lazy('subevent', 'All dates') + ) + + def __init__(self, *args, **kwargs): + self.event = kwargs.pop('event') + super().__init__(*args, **kwargs) + self.initial['status'] = "np" + self.fields['item'].choices = [('', _('All products'))] + [(item.id, item.name) for item in + Item.objects.filter(event=self.event)] + + if self.event.has_subevents: + self.fields["subevent"].queryset = self.event.subevents.all() + self.fields['subevent'].widget = Select2( + attrs={ + 'class': 'form-control simple-subevent-choice', + 'data-model-select2': 'event', + 'data-select2-url': reverse('control:event.subevents.select2', kwargs={ + 'event': self.event.slug, + 'organizer': self.event.organizer.slug, + }), + 'data-placeholder': pgettext_lazy('subevent', 'All dates') + } + ) + self.fields['subevent'].widget.choices = self.fields['subevent'].choices + else: + del self.fields['subevent'] + + class QuotaForm(I18nModelForm): itemvars = forms.MultipleChoiceField( label=_("Products"), diff --git a/src/pretix/control/views/item.py b/src/pretix/control/views/item.py index 2992a1c2a4..caa77511e4 100644 --- a/src/pretix/control/views/item.py +++ b/src/pretix/control/views/item.py @@ -38,7 +38,6 @@ from collections import OrderedDict, namedtuple from itertools import groupby from json.decoder import JSONDecodeError -from django import forms from django.contrib import messages from django.core.exceptions import PermissionDenied from django.core.files import File @@ -46,9 +45,9 @@ from django.db import transaction from django.db.models import ( Count, Exists, F, OuterRef, Prefetch, ProtectedError, Q, ) -from django.forms import Select -from django.forms.fields import MultipleChoiceField -from django.forms.models import inlineformset_factory, ModelMultipleChoiceField, ModelChoiceField + +from django.forms.models import inlineformset_factory + from django.http import ( Http404, HttpResponse, HttpResponseBadRequest, HttpResponseRedirect, ) @@ -56,7 +55,7 @@ from django.shortcuts import redirect from django.urls import resolve, reverse from django.utils.functional import cached_property from django.utils.timezone import now -from django.utils.translation import gettext, gettext_lazy as _, pgettext_lazy +from django.utils.translation import gettext, gettext_lazy as _ from django.views.decorators.http import require_http_methods from django.views.generic import ListView from django.views.generic.detail import DetailView, SingleObjectMixin @@ -72,7 +71,6 @@ from pretix.base.models import ( OrderPosition, Question, QuestionAnswer, QuestionOption, Quota, SeatCategoryMapping, Voucher, ) -from pretix.base.models.event import Event from pretix.base.models.event import SubEvent from pretix.base.models.items import ItemAddOn, ItemBundle, ItemMetaValue from pretix.base.services.quotas import QuotaAvailability @@ -82,14 +80,14 @@ from pretix.control.forms.item import ( CategoryForm, ItemAddOnForm, ItemAddOnsFormSet, ItemBundleForm, ItemBundleFormSet, ItemCreateForm, ItemMetaValueForm, ItemProgramTimeForm, ItemProgramTimeFormSet, ItemUpdateForm, ItemVariationForm, - ItemVariationsFormSet, QuestionForm, QuestionOptionForm, QuotaForm, + ItemVariationsFormSet, QuestionFilterForm, QuestionForm, + QuestionOptionForm, QuotaForm, ) from pretix.control.permissions import ( EventPermissionRequiredMixin, event_permission_required, ) from pretix.control.signals import item_forms, item_formsets from pretix.helpers.models import modelcopy -from ..forms.widgets import Select2, Select2Multiple from ...helpers.compat import CompatDeleteView from . import ChartContainingView, CreateView, PaginationMixin, UpdateView @@ -611,65 +609,6 @@ class QuestionDelete(EventPermissionRequiredMixin, CompatDeleteView): }) -class QuestionFilterForm(forms.Form): - STATUS_VARIANTS = [ - ("", _("All orders")), - ("p", _("Paid")), - ("pv", _("Paid or confirmed")), - ("n", _("Pending")), - ("np", _("Pending or paid")), - ("o", _("Pending (overdue)")), - ("e", _("Expired")), - ("ne", _("Pending or expired")), - ("c", _("Canceled")) - ] - - status = forms.ChoiceField( - choices=STATUS_VARIANTS, - widget=forms.Select( - attrs={ - 'class': 'form-control', - } - ), - required=False, - ) - item = forms.ChoiceField( - choices=[], - widget=forms.Select( - attrs={'class': 'form-control'} - ), - required=False - ) - subevent = forms.ModelChoiceField( - queryset=SubEvent.objects.none(), - required=False, - empty_label=pgettext_lazy('subevent', 'All dates') - ) - - def __init__(self, *args, **kwargs): - self.event = kwargs.pop('event') - super().__init__(*args, **kwargs) - self.initial['status']="np" - self.fields['item'].choices = [('', _('All products'))] + [(item.id, item.name) for item in Item.objects.filter(event=self.event)] - - if self.event.has_subevents: - self.fields["subevent"].queryset = self.event.subevents.all() - self.fields['subevent'].widget = Select2( - attrs={ - 'class': 'form-control simple-subevent-choice', - 'data-model-select2': 'event', - 'data-select2-url': reverse('control:event.subevents.select2', kwargs={ - 'event': self.event.slug, - 'organizer': self.event.organizer.slug, - }), - 'data-placeholder': pgettext_lazy('subevent', 'All dates') - } - ) - self.fields['subevent'].widget.choices = self.fields['subevent'].choices - else: - del self.fields['subevent'] - - class QuestionMixin: @cached_property def formset(self):