diff --git a/src/pretix/presale/views/event.py b/src/pretix/presale/views/event.py index 977c12ac9c..60c8ee254e 100644 --- a/src/pretix/presale/views/event.py +++ b/src/pretix/presale/views/event.py @@ -59,7 +59,7 @@ def item_group_by_category(items): def get_grouped_items(event, subevent=None, voucher=None, channel='web', require_seat=0, base_qs=None, allow_addons=False, - quota_cache=None): + quota_cache=None, filter_items=None, filter_categories=None): base_qs = base_qs if base_qs is not None else event.items items = base_qs.using(settings.DATABASE_REPLICA).filter_available(channel=channel, voucher=voucher, allow_addons=allow_addons).select_related( 'category', 'tax_rule', # for re-grouping @@ -124,6 +124,12 @@ def get_grouped_items(event, subevent=None, voucher=None, channel='web', require items = items.filter(requires_seat__gt=0) else: items = items.filter(requires_seat=0) + + if filter_items: + items = items.filter(pk__in=[a for a in filter_items if a.isdigit()]) + if filter_categories: + items = items.filter(category_id__in=[a for a in filter_categories if a.isdigit()]) + display_add_to_cart = False external_quota_cache = quota_cache or event.cache.get('item_quota_cache') quota_cache = external_quota_cache or {} @@ -359,8 +365,12 @@ class EventIndex(EventViewMixin, EventListMixin, CartMixin, TemplateView): if not self.request.event.has_subevents or self.subevent: # Fetch all items - items, display_add_to_cart = get_grouped_items(self.request.event, self.subevent, - channel=self.request.sales_channel.identifier) + items, display_add_to_cart = get_grouped_items( + self.request.event, self.subevent, + filter_items=self.request.GET.getlist('item'), + filter_categories=self.request.GET.getlist('category'), + channel=self.request.sales_channel.identifier + ) context['itemnum'] = len(items) context['allfree'] = all( item.display_price.gross == Decimal('0.00') for item in items if not item.has_variations diff --git a/src/tests/presale/test_event.py b/src/tests/presale/test_event.py index cdc4cb9eb6..ea6bf14a8f 100644 --- a/src/tests/presale/test_event.py +++ b/src/tests/presale/test_event.py @@ -93,6 +93,16 @@ class ItemDisplayTest(EventTestMixin, SoupTest): self.assertNotIn("Early-bird", html) self.assertNotIn("btn-add-to-cart", html) + def test_filter_by_url(self): + with scopes_disabled(): + q = Quota.objects.create(event=self.event, name='Quota', size=2) + item = Item.objects.create(event=self.event, name='Early-bird ticket', default_price=0, active=True) + q.items.add(item) + doc = self.get_doc('/%s/%s/?item=%d' % (self.orga.slug, self.event.slug, item.pk)) + self.assertIn("Early-bird", doc.select("section .product-row")[0].text) + doc = self.get_doc('/%s/%s/?item=%d' % (self.orga.slug, self.event.slug, item.pk + 1)) + assert not doc.select("section .product-row") + def test_without_category(self): with scopes_disabled(): q = Quota.objects.create(event=self.event, name='Quota', size=2)