diff --git a/src/pretix/control/forms/item.py b/src/pretix/control/forms/item.py index 4797352b87..1c3fdad820 100644 --- a/src/pretix/control/forms/item.py +++ b/src/pretix/control/forms/item.py @@ -227,6 +227,18 @@ class ItemCreateForm(I18nModelForm): super().__init__(*args, **kwargs) self.fields['category'].queryset = self.instance.event.categories.all() + self.fields['category'].widget = Select2( + attrs={ + 'data-model-select2': 'generic', + 'data-select2-url': reverse('control:event.items.categories.select2', kwargs={ + 'event': self.instance.event.slug, + 'organizer': self.instance.event.organizer.slug, + }), + 'data-placeholder': _('No category'), + } + ) + self.fields['category'].widget.choices = self.fields['category'].choices + self.fields['tax_rule'].queryset = self.instance.event.tax_rules.all() change_decimal_field(self.fields['default_price'], self.instance.event.currency) self.fields['tax_rule'].empty_label = _('No taxation') @@ -399,7 +411,6 @@ class TicketNullBooleanSelect(forms.NullBooleanSelect): class ItemUpdateForm(I18nModelForm): def __init__(self, *args, **kwargs): super().__init__(*args, **kwargs) - self.fields['category'].queryset = self.instance.event.categories.all() self.fields['tax_rule'].queryset = self.instance.event.tax_rules.all() self.fields['description'].widget.attrs['placeholder'] = _( 'e.g. This reduced price is available for full-time students, jobless and people ' @@ -431,6 +442,19 @@ class ItemUpdateForm(I18nModelForm): self.fields['hidden_if_available'].widget.choices = self.fields['hidden_if_available'].choices self.fields['hidden_if_available'].required = False + self.fields['category'].queryset = self.instance.event.categories.all() + self.fields['category'].widget = Select2( + attrs={ + 'data-model-select2': 'generic', + 'data-select2-url': reverse('control:event.items.categories.select2', kwargs={ + 'event': self.instance.event.slug, + 'organizer': self.instance.event.organizer.slug, + }), + 'data-placeholder': _('No category'), + } + ) + self.fields['category'].widget.choices = self.fields['category'].choices + def clean(self): d = super().clean() if d['issue_giftcard']: @@ -604,6 +628,16 @@ class ItemAddOnForm(I18nModelForm): def __init__(self, *args, **kwargs): super().__init__(*args, **kwargs) self.fields['addon_category'].queryset = self.event.categories.all() + self.fields['addon_category'].widget = Select2( + attrs={ + 'data-model-select2': 'generic', + 'data-select2-url': reverse('control:event.items.categories.select2', kwargs={ + 'event': self.event.slug, + 'organizer': self.event.organizer.slug, + }), + } + ) + self.fields['addon_category'].widget.choices = self.fields['addon_category'].choices class Meta: model = ItemAddOn diff --git a/src/pretix/control/urls.py b/src/pretix/control/urls.py index 9b9efa3f01..bc42027308 100644 --- a/src/pretix/control/urls.py +++ b/src/pretix/control/urls.py @@ -160,6 +160,7 @@ urlpatterns = [ url(r'^items/(?P\d+)/down$', item.item_move_down, name='event.items.down'), url(r'^items/(?P\d+)/delete$', item.ItemDelete.as_view(), name='event.items.delete'), url(r'^categories/$', item.CategoryList.as_view(), name='event.items.categories'), + url(r'^categories/select2$', typeahead.category_select2, name='event.items.categories.select2'), url(r'^categories/(?P\d+)/delete$', item.CategoryDelete.as_view(), name='event.items.categories.delete'), url(r'^categories/(?P\d+)/up$', item.category_move_up, name='event.items.categories.up'), diff --git a/src/pretix/control/views/typeahead.py b/src/pretix/control/views/typeahead.py index df9b12aa69..1d63b1808d 100644 --- a/src/pretix/control/views/typeahead.py +++ b/src/pretix/control/views/typeahead.py @@ -319,6 +319,36 @@ def quotas_select2(request, **kwargs): return JsonResponse(doc) +@event_permission_required(None) +def category_select2(request, **kwargs): + query = request.GET.get('query', '') + try: + page = int(request.GET.get('page', '1')) + except ValueError: + page = 1 + + qs = request.event.categories.filter( + name__icontains=i18ncomp(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) + + @event_permission_required(None) def checkinlist_select2(request, **kwargs): query = request.GET.get('query', '') @@ -327,7 +357,7 @@ def checkinlist_select2(request, **kwargs): except ValueError: page = 1 - qf = Q(name__icontains=i18ncomp(query)) + qf = Q(name__icontains=query) try: dt = parse(query)