diff --git a/src/pretix/control/forms/filter.py b/src/pretix/control/forms/filter.py index d6e2865d3e..bb8d00374b 100644 --- a/src/pretix/control/forms/filter.py +++ b/src/pretix/control/forms/filter.py @@ -2397,6 +2397,61 @@ class CheckinFilterForm(FilterForm): return qs +class CheckinListFilterForm(FilterForm): + orders = { + "name": ("name", "subevent__date_from", "pk"), + "-name": ("-name", "-subevent__date_from", "-pk"), + "subevent": ("subevent__date_from", "name", "pk"), + "-subevent": ("-subevent__date_from", "-name", "-pk"), + } + subevent = forms.ModelChoiceField( + label=pgettext_lazy('subevent', 'Date'), + 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) + if self.event.has_subevents: + self.fields['subevent'].queryset = self.event.subevents.all() + self.fields['subevent'].widget = Select2( + attrs={ + '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 + elif 'subevent': + del self.fields['subevent'] + + def filter_qs(self, qs): + fdata = self.cleaned_data + + if fdata.get('subevent'): + qs = qs.filter(subevent=fdata.get('subevent')) + + if fdata.get("ordering"): + ob = self.orders[fdata.get('ordering')] + if isinstance(ob, dict): + ob = dict(ob) + o = ob.pop('_order') + qs = qs.annotate(**ob).order_by(*get_deterministic_ordering(OrderPosition, [o])) + elif isinstance(ob, (list, tuple)): + qs = qs.order_by(*get_deterministic_ordering(OrderPosition, ob)) + else: + qs = qs.order_by(*get_deterministic_ordering(OrderPosition, [ob])) + else: + qs = qs.order_by("subevent__date_from", "name", "pk") + + return qs.distinct() + + class DeviceFilterForm(FilterForm): orders = { 'name': Upper('name'), diff --git a/src/pretix/control/templates/pretixcontrol/checkin/lists.html b/src/pretix/control/templates/pretixcontrol/checkin/lists.html index eb265ec326..5a0246dce3 100644 --- a/src/pretix/control/templates/pretixcontrol/checkin/lists.html +++ b/src/pretix/control/templates/pretixcontrol/checkin/lists.html @@ -1,5 +1,7 @@ {% extends "pretixcontrol/items/base.html" %} {% load i18n %} +{% load bootstrap3 %} +{% load urlreplace %} {% block title %}{% trans "Check-in lists" %}{% endblock %} {% block inside %}

{% trans "Check-in lists" %}

@@ -27,11 +29,26 @@ {% endblocktrans %}

{% if request.event.has_subevents %} -
- - {% include "pretixcontrol/event/fragment_subevent_choice_simple.html" %} +
+
+

{% trans "Filter" %}

+
+ +
+ {% if filter_form.subevent %} +
+ {% bootstrap_field filter_form.subevent %} +
+ {% endif %} +
+
+ +
- +
{% endif %} {% if checkinlists|length == 0 %}
@@ -47,7 +64,8 @@ {% if "can_change_event_settings" in request.eventpermset %} {% trans "Create a new check-in list" %} + class="btn btn-primary btn-lg"> {% trans "Create a new check-in list" %} + {% endif %} {% if can_change_organizer_settings %} - {% trans "Check-in lists" %} + + {% trans "Name" %} + + + {% trans "Checked in" %} {% if request.event.has_subevents %} - {% trans "Date" context "subevent" %} + + {% trans "Date" context "subevent" %} + + + {% endif %} {% trans "Automated check-in" %} {% trans "Products" %} @@ -83,7 +109,8 @@ {% for cl in checkinlists %} - {{ cl.name }} + {{ cl.name }}
@@ -92,14 +119,16 @@
- {{ cl.checkin_count|default_if_none:"0" }} / {{ cl.position_count|default_if_none:"0" }} + {{ cl.checkin_count|default_if_none:"0" }} / + {{ cl.position_count|default_if_none:"0" }}
{% if request.event.has_subevents %} {% if cl.subevent %} - {{ cl.subevent.name }} – {{ cl.subevent.get_date_range_display }} {{ cl.subevent.date_from|date:"TIME_FORMAT" }} + {{ cl.subevent.name }} – {{ cl.subevent.get_date_range_display }} + {{ cl.subevent.date_from|date:"TIME_FORMAT" }} {% else %} @@ -127,17 +156,20 @@ {% endif %} - + {% if "can_change_event_settings" in request.eventpermset %} + class="btn btn-sm btn-default" title="{% trans "Clone" %}" data-toggle="tooltip"> - - + + {% endif %} diff --git a/src/pretix/control/views/checkin.py b/src/pretix/control/views/checkin.py index 47ab6754f5..ed36656a74 100644 --- a/src/pretix/control/views/checkin.py +++ b/src/pretix/control/views/checkin.py @@ -61,7 +61,7 @@ from pretix.control.forms.checkin import ( CheckinListForm, CheckinListSimulatorForm, ) from pretix.control.forms.filter import ( - CheckinFilterForm, CheckinListAttendeeFilterForm, + CheckinFilterForm, CheckinListAttendeeFilterForm, CheckinListFilterForm, ) from pretix.control.permissions import EventPermissionRequiredMixin from pretix.control.views import CreateView, PaginationMixin, UpdateView @@ -279,13 +279,13 @@ class CheckinListList(EventPermissionRequiredMixin, PaginationMixin, ListView): context_object_name = 'checkinlists' permission = 'can_view_orders' template_name = 'pretixcontrol/checkin/lists.html' + ordering = ('subevent__date_from', 'name', 'pk') def get_queryset(self): qs = self.request.event.checkin_lists.select_related('subevent').prefetch_related("limit_products") - if self.request.GET.get("subevent", "") != "": - s = self.request.GET.get("subevent", "") - qs = qs.filter(subevent_id=s) + if self.filter_form.is_valid(): + qs = self.filter_form.filter_qs(qs) return qs def get_context_data(self, **kwargs): @@ -304,9 +304,14 @@ class CheckinListList(EventPermissionRequiredMixin, PaginationMixin, ListView): 'can_change_organizer_settings', self.request ) + ctx['filter_form'] = self.filter_form return ctx + @cached_property + def filter_form(self): + return CheckinListFilterForm(data=self.request.GET, event=self.request.event) + class CheckinListCreate(EventPermissionRequiredMixin, CreateView): model = CheckinList