From 5c8a3f18f3b527cd872bb122120ddffdeea81a32 Mon Sep 17 00:00:00 2001 From: Raphael Michel Date: Fri, 10 Mar 2023 15:21:25 +0100 Subject: [PATCH] Check-in log: Add select2 for gate selection --- src/pretix/control/forms/filter.py | 11 ++++++++++ src/pretix/control/urls.py | 1 + src/pretix/control/views/typeahead.py | 30 +++++++++++++++++++++++++++ src/tests/control/test_permissions.py | 1 + 4 files changed, 43 insertions(+) diff --git a/src/pretix/control/forms/filter.py b/src/pretix/control/forms/filter.py index 1a609daeec..db874d193e 100644 --- a/src/pretix/control/forms/filter.py +++ b/src/pretix/control/forms/filter.py @@ -2215,6 +2215,17 @@ class CheckinFilterForm(FilterForm): self.fields['device'].label = _('Device') self.fields['gate'].queryset = self.event.organizer.gates.all() + self.fields['gate'].widget = Select2( + attrs={ + 'data-model-select2': 'generic', + 'data-select2-url': reverse('control:organizer.gates.select2', kwargs={ + 'organizer': self.event.organizer.slug, + }), + 'data-placeholder': _('All gates'), + } + ) + self.fields['gate'].widget.choices = self.fields['gate'].choices + self.fields['gate'].label = _('Gate') self.fields['checkin_list'].queryset = self.event.checkin_lists.all() self.fields['checkin_list'].widget = Select2( diff --git a/src/pretix/control/urls.py b/src/pretix/control/urls.py index 91045a97fd..5226cdc307 100644 --- a/src/pretix/control/urls.py +++ b/src/pretix/control/urls.py @@ -191,6 +191,7 @@ urlpatterns = [ re_path(r'^organizer/(?P[^/]+)/device/(?P[^/]+)/logs$', organizer.DeviceLogView.as_view(), name='organizer.device.logs'), re_path(r'^organizer/(?P[^/]+)/gates$', organizer.GateListView.as_view(), name='organizer.gates'), + re_path(r'^organizer/(?P[^/]+)/gates/select2$', typeahead.gate_select2, name='organizer.gates.select2'), re_path(r'^organizer/(?P[^/]+)/gate/add$', organizer.GateCreateView.as_view(), name='organizer.gate.add'), re_path(r'^organizer/(?P[^/]+)/gate/(?P[^/]+)/edit$', organizer.GateUpdateView.as_view(), name='organizer.gate.edit'), diff --git a/src/pretix/control/views/typeahead.py b/src/pretix/control/views/typeahead.py index e5840dfb3c..d85b7a14df 100644 --- a/src/pretix/control/views/typeahead.py +++ b/src/pretix/control/views/typeahead.py @@ -869,3 +869,33 @@ def devices_select2(request, **kwargs): } } return JsonResponse(doc) + + +@organizer_permission_required(("can_view_orders", "can_change_organizer_settings")) +# This decorator is a bit of a hack since this is not technically an organizer permission, but it does the job here -- +# anyone who can see orders for any event can see the check-in log view where this is used as a filter +def gate_select2(request, **kwargs): + query = request.GET.get('query', '') + try: + page = int(request.GET.get('page', '1')) + except ValueError: + page = 1 + + qs = request.organizer.gates.filter(Q(name__icontains=query) | Q(identifier__icontains=query)).order_by('name') + + total = qs.count() + pagesize = 20 + offset = (page - 1) * pagesize + doc = { + 'results': [ + { + 'id': e.pk, + 'text': str(e), + } + for e in qs[offset:offset + pagesize] + ], + 'pagination': { + "more": total >= (offset + pagesize) + } + } + return JsonResponse(doc) diff --git a/src/tests/control/test_permissions.py b/src/tests/control/test_permissions.py index 242c95b195..41c7a6c9ce 100644 --- a/src/tests/control/test_permissions.py +++ b/src/tests/control/test_permissions.py @@ -519,6 +519,7 @@ organizer_permission_urls = [ ("can_change_organizer_settings", "organizer/dummy/device/1/connect", 404), ("can_change_organizer_settings", "organizer/dummy/device/1/revoke", 404), ("can_change_organizer_settings", "organizer/dummy/gates", 200), + ("can_change_organizer_settings", "organizer/dummy/gates/select2", 200), ("can_change_organizer_settings", "organizer/dummy/gate/add", 200), ("can_change_organizer_settings", "organizer/dummy/gate/1/edit", 404), ("can_change_organizer_settings", "organizer/dummy/gate/1/delete", 404),