diff --git a/src/pretix/control/forms/vouchers.py b/src/pretix/control/forms/vouchers.py index 633e24651..37120f723 100644 --- a/src/pretix/control/forms/vouchers.py +++ b/src/pretix/control/forms/vouchers.py @@ -3,11 +3,13 @@ import copy from django import forms from django.core.exceptions import ValidationError from django.db.models.functions import Lower -from django.utils.translation import ugettext_lazy as _ +from django.urls import reverse +from django.utils.translation import pgettext_lazy, ugettext_lazy as _ from pretix.base.forms import I18nModelForm from pretix.base.models import Item, ItemVariation, Quota, Voucher from pretix.control.forms import SplitDateTimePickerWidget +from pretix.control.forms.widgets import Select2 from pretix.control.signals import voucher_form_validation @@ -54,6 +56,18 @@ class VoucherForm(I18nModelForm): if instance.event.has_subevents: self.fields['subevent'].queryset = instance.event.subevents.all() + self.fields['subevent'].widget = Select2( + attrs={ + 'data-model-select2': 'event', + 'data-select2-url': reverse('control:event.subevents.select2', kwargs={ + 'event': instance.event.slug, + 'organizer': instance.event.organizer.slug, + }), + 'data-placeholder': pgettext_lazy('subevent', 'Date') + } + ) + self.fields['subevent'].widget.choices = self.fields['subevent'].choices + self.fields['subevent'].required = True elif 'subevent': del self.fields['subevent'] diff --git a/src/pretix/control/urls.py b/src/pretix/control/urls.py index c3a0849b3..aaee886c9 100644 --- a/src/pretix/control/urls.py +++ b/src/pretix/control/urls.py @@ -192,6 +192,7 @@ urlpatterns = [ name='event.orders.waitinglist.delete'), url(r'^checkinlists/$', checkin.CheckinListList.as_view(), name='event.orders.checkinlists'), url(r'^checkinlists/add$', checkin.CheckinListCreate.as_view(), name='event.orders.checkinlists.add'), + url(r'^checkinlists/select2$', typeahead.checkinlist_select2, name='event.orders.checkinlists.select2'), url(r'^checkinlists/(?P\d+)/$', checkin.CheckInListShow.as_view(), name='event.orders.checkinlists.show'), url(r'^checkinlists/(?P\d+)/change$', checkin.CheckinListUpdate.as_view(), name='event.orders.checkinlists.edit'), diff --git a/src/pretix/control/views/typeahead.py b/src/pretix/control/views/typeahead.py index 3cfdf7feb..069816863 100644 --- a/src/pretix/control/views/typeahead.py +++ b/src/pretix/control/views/typeahead.py @@ -115,6 +115,49 @@ def subevent_select2(request, **kwargs): return JsonResponse(doc) +@event_permission_required(None) +def checkinlist_select2(request, **kwargs): + query = request.GET.get('query', '') + try: + page = int(request.GET.get('page', '1')) + except ValueError: + page = 1 + + qf = Q(name__icontains=i18ncomp(query)) + + try: + dt = parse(query) + except ValueError: + pass + else: + tz = request.event.timezone + if dt and request.event.has_subevents: + dt_start = make_aware(datetime.combine(dt.date(), time(hour=0, minute=0, second=0)), tz) + dt_end = make_aware(datetime.combine(dt.date(), time(hour=23, minute=59, second=59)), tz) + qf |= Q(subevent__date_from__gte=dt_start) & Q(subevent__date_from__lte=dt_end) + + qs = request.event.checkin_lists.filter( + qf + ).order_by('name') + + total = qs.count() + pagesize = 20 + offset = (page - 1) * pagesize + doc = { + 'results': [ + { + 'id': e.pk, + 'text': str(e.name), + } + for e in qs[offset:offset + pagesize] + ], + 'pagination': { + "more": total >= (offset + pagesize) + } + } + return JsonResponse(doc) + + def organizer_select2(request): term = request.GET.get('query', '') try: diff --git a/src/pretix/plugins/checkinlists/exporters.py b/src/pretix/plugins/checkinlists/exporters.py index c0a6c70ea..4d1e2be09 100644 --- a/src/pretix/plugins/checkinlists/exporters.py +++ b/src/pretix/plugins/checkinlists/exporters.py @@ -6,6 +6,7 @@ from defusedcsv import csv from django import forms from django.db.models import Max, OuterRef, Subquery from django.db.models.functions import Coalesce +from django.urls import reverse from django.utils.formats import date_format from django.utils.timezone import is_aware, make_aware from django.utils.translation import pgettext, ugettext as _, ugettext_lazy @@ -16,6 +17,7 @@ from reportlab.platypus import Flowable, Paragraph, Spacer, Table, TableStyle from pretix.base.exporter import BaseExporter from pretix.base.models import Checkin, Order, OrderPosition, Question from pretix.base.templatetags.money import money_filter +from pretix.control.forms.widgets import Select2 from pretix.plugins.reports.exporters import ReportlabExportMixin @@ -60,6 +62,21 @@ class BaseCheckinList(BaseExporter): )), ] ) + + d['list'].queryset = self.event.checkin_lists.all() + d['list'].widget = Select2( + attrs={ + 'data-model-select2': 'generic', + 'data-select2-url': reverse('control:event.orders.checkinlists.select2', kwargs={ + 'event': self.event.slug, + 'organizer': self.event.organizer.slug, + }), + 'data-placeholder': _('Check-in list') + } + ) + d['list'].widget.choices = d['list'].choices + d['list'].required = True + return d diff --git a/src/pretix/plugins/pretixdroid/forms.py b/src/pretix/plugins/pretixdroid/forms.py index 5eb2c51f5..508da8398 100644 --- a/src/pretix/plugins/pretixdroid/forms.py +++ b/src/pretix/plugins/pretixdroid/forms.py @@ -1,5 +1,8 @@ from django import forms +from django.urls import reverse +from django.utils.translation import ugettext_lazy as _ +from pretix.control.forms.widgets import Select2 from pretix.plugins.pretixdroid.models import AppConfiguration @@ -19,3 +22,15 @@ class AppConfigurationForm(forms.ModelForm): super().__init__(**kwargs) self.fields['items'].queryset = self.event.items.all() self.fields['list'].queryset = self.event.checkin_lists.all() + self.fields['list'].widget = Select2( + attrs={ + 'data-model-select2': 'generic', + 'data-select2-url': reverse('control:event.orders.checkinlists.select2', kwargs={ + 'event': self.event.slug, + 'organizer': self.event.organizer.slug, + }), + 'data-placeholder': _('Check-in list') + } + ) + self.fields['list'].widget.choices = self.fields['list'].choices + self.fields['list'].required = True