From ce73d4831e83f6aeaf9fc41c8e8481ce203c6e66 Mon Sep 17 00:00:00 2001
From: Raphael Michel
Date: Wed, 6 Sep 2023 13:23:54 +0200
Subject: [PATCH] Allow to sort the list of check-in lists (Z#23128978) (#3568)
---
src/pretix/control/forms/filter.py | 55 +++++++++++++++++
.../pretixcontrol/checkin/lists.html | 60 ++++++++++++++-----
src/pretix/control/views/checkin.py | 13 ++--
3 files changed, 110 insertions(+), 18 deletions(-)
diff --git a/src/pretix/control/forms/filter.py b/src/pretix/control/forms/filter.py
index d6e2865d3..bb8d00374 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 eb265ec32..5a0246dce 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 %}
-