replace manual form with QuestionFilterForm

This commit is contained in:
Lukas Bockstaller
2025-12-03 16:31:37 +01:00
parent d3fde85c39
commit f645b5a2d9
2 changed files with 77 additions and 30 deletions
@@ -20,35 +20,17 @@
</div> </div>
<form class="panel-body filter-form" action="" method="get"> <form class="panel-body filter-form" action="" method="get">
<div class="row"> <div class="row">
<div class="col-lg-2 col-sm-6 col-xs-6"> <div class="col-lg-2 col-sm-6 col-xs-6">
<select name="status" class="form-control"> {{ form.status }}
<option value="" {% if request.GET.status == "" %}selected="selected"{% endif %}>{% trans "All orders" %}</option> </div>
<option value="p" {% if request.GET.status == "p" %}selected="selected"{% endif %}>{% trans "Paid" %}</option> <div class="col-lg-5 col-sm-6 col-xs-6">
<option value="pv" {% if request.GET.status == "pv" %}selected="selected"{% endif %}>{% trans "Paid or confirmed" %}</option> {{ form.item }}
<option value="n" {% if request.GET.status == "n" %}selected="selected"{% endif %}>{% trans "Pending" %}</option> </div>
<option value="np" {% if request.GET.status == "np" or "status" not in request.GET %}selected="selected"{% endif %}>{% trans "Pending or paid" %}</option>
<option value="o" {% if request.GET.status == "o" %}selected="selected"{% endif %}>{% trans "Pending (overdue)" %}</option>
<option value="e" {% if request.GET.status == "e" %}selected="selected"{% endif %}>{% trans "Expired" %}</option>
<option value="ne" {% if request.GET.status == "ne" %}selected="selected"{% endif %}>{% trans "Pending or expired" %}</option>
<option value="c" {% if request.GET.status == "c" %}selected="selected"{% endif %}>{% trans "Canceled" %}</option>
</select>
</div>
<div class="col-lg-5 col-sm-6 col-xs-6"> <div class="col-lg-5 col-sm-6 col-xs-6">
<select name="item" class="form-control"> <p>
<option value="">{% trans "All products" %}</option> {{ form.subevent }}
{% for item in items %} </p>
<option value="{{ item.id }}"
{% if request.GET.item|add:0 == item.id %}selected="selected"{% endif %}>
{{ item.name }}
</option>
{% endfor %}
</select>
</div> </div>
{% if request.event.has_subevents %}
<div class="col-lg-5 col-sm-6 col-xs-6">
{% include "pretixcontrol/event/fragment_subevent_choice_simple.html" %}
</div>
{% endif %}
</div> </div>
<div class="text-right"> <div class="text-right">
<button class="btn btn-primary btn-lg" type="submit"> <button class="btn btn-primary btn-lg" type="submit">
+68 -3
View File
@@ -38,6 +38,7 @@ from collections import OrderedDict, namedtuple
from itertools import groupby from itertools import groupby
from json.decoder import JSONDecodeError from json.decoder import JSONDecodeError
from django import forms
from django.contrib import messages from django.contrib import messages
from django.core.exceptions import PermissionDenied from django.core.exceptions import PermissionDenied
from django.core.files import File from django.core.files import File
@@ -45,7 +46,9 @@ from django.db import transaction
from django.db.models import ( from django.db.models import (
Count, Exists, F, OuterRef, Prefetch, ProtectedError, Q, Count, Exists, F, OuterRef, Prefetch, ProtectedError, Q,
) )
from django.forms.models import inlineformset_factory from django.forms import Select
from django.forms.fields import MultipleChoiceField
from django.forms.models import inlineformset_factory, ModelMultipleChoiceField, ModelChoiceField
from django.http import ( from django.http import (
Http404, HttpResponse, HttpResponseBadRequest, HttpResponseRedirect, Http404, HttpResponse, HttpResponseBadRequest, HttpResponseRedirect,
) )
@@ -53,7 +56,7 @@ from django.shortcuts import redirect
from django.urls import resolve, reverse from django.urls import resolve, reverse
from django.utils.functional import cached_property 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, gettext_lazy as _ from django.utils.translation import gettext, gettext_lazy as _, pgettext_lazy
from django.views.decorators.http import require_http_methods from django.views.decorators.http import require_http_methods
from django.views.generic import ListView from django.views.generic import ListView
from django.views.generic.detail import DetailView, SingleObjectMixin from django.views.generic.detail import DetailView, SingleObjectMixin
@@ -69,6 +72,7 @@ from pretix.base.models import (
OrderPosition, Question, QuestionAnswer, QuestionOption, Quota, OrderPosition, Question, QuestionAnswer, QuestionOption, Quota,
SeatCategoryMapping, Voucher, SeatCategoryMapping, Voucher,
) )
from pretix.base.models.event import Event
from pretix.base.models.event import SubEvent from pretix.base.models.event import SubEvent
from pretix.base.models.items import ItemAddOn, ItemBundle, ItemMetaValue from pretix.base.models.items import ItemAddOn, ItemBundle, ItemMetaValue
from pretix.base.services.quotas import QuotaAvailability from pretix.base.services.quotas import QuotaAvailability
@@ -85,6 +89,7 @@ from pretix.control.permissions import (
) )
from pretix.control.signals import item_forms, item_formsets from pretix.control.signals import item_forms, item_formsets
from pretix.helpers.models import modelcopy from pretix.helpers.models import modelcopy
from ..forms.widgets import Select2, Select2Multiple
from ...helpers.compat import CompatDeleteView from ...helpers.compat import CompatDeleteView
from . import ChartContainingView, CreateView, PaginationMixin, UpdateView from . import ChartContainingView, CreateView, PaginationMixin, UpdateView
@@ -606,6 +611,65 @@ 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: class QuestionMixin:
@cached_property @cached_property
def formset(self): def formset(self):
@@ -660,7 +724,7 @@ class QuestionMixin:
return ctx return ctx
class QuestionView(EventPermissionRequiredMixin, QuestionMixin, ChartContainingView, DetailView): class QuestionView(EventPermissionRequiredMixin, ChartContainingView, DetailView):
model = Question model = Question
template_name = 'pretixcontrol/items/question.html' template_name = 'pretixcontrol/items/question.html'
permission = 'can_change_items' permission = 'can_change_items'
@@ -749,6 +813,7 @@ class QuestionView(EventPermissionRequiredMixin, QuestionMixin, ChartContainingV
ctx['items'] = self.object.items.all() ctx['items'] = self.object.items.all()
stats = self.get_answer_statistics() stats = self.get_answer_statistics()
ctx['stats'], ctx['total'] = stats ctx['stats'], ctx['total'] = stats
ctx['form'] = QuestionFilterForm(data=self.request.GET, event=self.request.event)
return ctx return ctx
def get_object(self, queryset=None) -> Question: def get_object(self, queryset=None) -> Question: