diff --git a/src/pretix/control/forms/filter.py b/src/pretix/control/forms/filter.py index db874d193..c704a6a46 100644 --- a/src/pretix/control/forms/filter.py +++ b/src/pretix/control/forms/filter.py @@ -61,7 +61,7 @@ from pretix.base.models import ( SubEventMetaValue, Team, TeamAPIToken, TeamInvite, Voucher, ) from pretix.base.signals import register_payment_providers -from pretix.control.forms.widgets import Select2 +from pretix.control.forms.widgets import Select2, Select2ItemVarQuota from pretix.control.signals import order_search_filter_q from pretix.helpers.countries import CachedCountries from pretix.helpers.database import ( @@ -2252,6 +2252,20 @@ class CheckinFilterForm(FilterForm): choices.append((str(i.pk), str(i))) self.fields['itemvar'].choices = choices + self.fields['itemvar'].choices = choices + self.fields['itemvar'].widget = Select2ItemVarQuota( + attrs={ + 'data-model-select2': 'generic', + 'data-select2-url': reverse('control:event.items.itemvar.select2', kwargs={ + 'event': self.event.slug, + 'organizer': self.event.organizer.slug, + }), + 'data-placeholder': _('All products') + } + ) + self.fields['itemvar'].required = False + self.fields['itemvar'].widget.choices = self.fields['itemvar'].choices + def filter_qs(self, qs): fdata = self.cleaned_data diff --git a/src/pretix/control/urls.py b/src/pretix/control/urls.py index 5226cdc30..ea7196723 100644 --- a/src/pretix/control/urls.py +++ b/src/pretix/control/urls.py @@ -273,6 +273,7 @@ urlpatterns = [ re_path(r'^items/(?P\d+)/delete$', item.ItemDelete.as_view(), name='event.items.delete'), re_path(r'^items/typeahead/meta/$', typeahead.item_meta_values, name='event.items.meta.typeahead'), re_path(r'^items/select2$', typeahead.items_select2, name='event.items.select2'), + re_path(r'^items/select2/itemvar$', typeahead.itemvar_select2, name='event.items.itemvar.select2'), re_path(r'^items/select2/variation$', typeahead.variations_select2, name='event.items.variations.select2'), re_path(r'^categories/$', item.CategoryList.as_view(), name='event.items.categories'), re_path(r'^categories/select2$', typeahead.category_select2, name='event.items.categories.select2'), diff --git a/src/pretix/control/views/typeahead.py b/src/pretix/control/views/typeahead.py index d85b7a14d..6dca1c7f7 100644 --- a/src/pretix/control/views/typeahead.py +++ b/src/pretix/control/views/typeahead.py @@ -545,6 +545,47 @@ def checkinlist_select2(request, **kwargs): return JsonResponse(doc) +@event_permission_required(None) +def itemvar_select2(request, **kwargs): + query = request.GET.get('query', '') + try: + page = int(request.GET.get('page', '1')) + except ValueError: + page = 1 + + pagesize = 20 + offset = (page - 1) * pagesize + + choices = [] + + # We are very unlikely to need pagination + itemqs = request.event.items.prefetch_related('variations').filter(Q(name__icontains=i18ncomp(query)) | Q(internal_name__icontains=query)) + total = itemqs.count() + + for i in itemqs[offset:offset + pagesize]: + variations = list(i.variations.all()) + if variations: + choices.append((str(i.pk), _('{product} – Any variation').format(product=i), not i.active)) + for v in variations: + choices.append(('%d-%d' % (i.pk, v.pk), '%s – %s' % (i, v.value), not v.active)) + else: + choices.append((str(i.pk), str(i), not i.active)) + + doc = { + 'results': [ + { + 'id': k, + 'text': str(v), + } + for k, v, d in choices + ], + 'pagination': { + "more": total >= (offset + pagesize) + } + } + return JsonResponse(doc) + + @event_permission_required(None) def itemvarquota_select2(request, **kwargs): query = request.GET.get('query', '') diff --git a/src/pretix/locale/de/LC_MESSAGES/django.po b/src/pretix/locale/de/LC_MESSAGES/django.po index da1251b8e..cf6898b7c 100644 --- a/src/pretix/locale/de/LC_MESSAGES/django.po +++ b/src/pretix/locale/de/LC_MESSAGES/django.po @@ -11881,7 +11881,7 @@ msgstr "Alle Produkte" #: pretix/control/views/typeahead.py:601 #, python-brace-format msgid "{product} – Any variation" -msgstr "{product} - Beliebige Variante" +msgstr "{product} – Beliebige Variante" #: pretix/control/forms/filter.py:514 pretix/control/forms/orders.py:775 msgctxt "subevent" diff --git a/src/pretix/locale/de_Informal/LC_MESSAGES/django.po b/src/pretix/locale/de_Informal/LC_MESSAGES/django.po index d22e1981f..83a2fbd2a 100644 --- a/src/pretix/locale/de_Informal/LC_MESSAGES/django.po +++ b/src/pretix/locale/de_Informal/LC_MESSAGES/django.po @@ -11859,7 +11859,7 @@ msgstr "Alle Produkte" #: pretix/control/views/typeahead.py:601 #, python-brace-format msgid "{product} – Any variation" -msgstr "{product} - Beliebige Variante" +msgstr "{product} – Beliebige Variante" #: pretix/control/forms/filter.py:514 pretix/control/forms/orders.py:775 msgctxt "subevent"