From d40492748a687d8a09a6681249dbab52a1d412ed Mon Sep 17 00:00:00 2001 From: Raphael Michel Date: Mon, 29 Jun 2026 19:02:06 +0200 Subject: [PATCH] Event product list: Hotfix for pathological performance in large event series (#6318) * Event product list: Hotfix for pathological performance * Stop outputting bullsht numbers to widget --- src/pretix/presale/views/event.py | 4 ++-- src/pretix/presale/views/widget.py | 2 +- src/tests/presale/test_widget.py | 12 ++++++------ 3 files changed, 9 insertions(+), 9 deletions(-) diff --git a/src/pretix/presale/views/event.py b/src/pretix/presale/views/event.py index 786377e3e3..d235e88afc 100644 --- a/src/pretix/presale/views/event.py +++ b/src/pretix/presale/views/event.py @@ -215,7 +215,6 @@ def get_grouped_items(event, *, channel: SalesChannel, subevent=None, voucher=No prefetch_var, prefetch_bundles, ).annotate( - quotac=Count('quotas'), has_variations=Count('variations'), subevent_disabled=Exists( SubEventItem.objects.filter( @@ -235,7 +234,8 @@ def get_grouped_items(event, *, channel: SalesChannel, subevent=None, voucher=No ), requires_seat=requires_seat, ).filter( - quotac__gt=0, subevent_disabled=False, + Exists(Quota.items.through.objects.filter(quota__subevent_id=subevent, item_id=OuterRef("pk"))), + subevent_disabled=False, ).order_by('category__position', 'category_id', 'position', 'name') if require_seat: items = items.filter(requires_seat__gt=0) diff --git a/src/pretix/presale/views/widget.py b/src/pretix/presale/views/widget.py index 6a4d4cfd0f..c1faab3878 100644 --- a/src/pretix/presale/views/widget.py +++ b/src/pretix/presale/views/widget.py @@ -352,7 +352,7 @@ class WidgetAPIProductList(EventListMixin, View): 'picture': get_picture(self.request.event, item.picture, '60x60^') if item.picture else None, 'picture_fullsize': get_picture(self.request.event, item.picture) if item.picture else None, 'description': str(rich_text(item.description, safelinks=False)) if item.description else None, - 'has_variations': item.has_variations, + 'has_variations': bool(item.has_variations), 'current_unavailability_reason': item.current_unavailability_reason, 'order_min': item.min_per_order, 'order_max': item.order_max if not item.has_variations else None, diff --git a/src/tests/presale/test_widget.py b/src/tests/presale/test_widget.py index 9b338ec915..fbdbd35ca3 100644 --- a/src/tests/presale/test_widget.py +++ b/src/tests/presale/test_widget.py @@ -193,7 +193,7 @@ class WidgetCartTest(CartTestMixin, TestCase): "suggested_price": {"gross": "23.00", "net": "19.33", "tax": "3.67", "name": "", "rate": "19.00", "includes_mixed_tax_rate": False}, "picture": None, "picture_fullsize": None, - "has_variations": 0, + "has_variations": False, "allow_waitinglist": True, "mandatory_priced_addons": False, "description": None, @@ -214,7 +214,7 @@ class WidgetCartTest(CartTestMixin, TestCase): "suggested_price": None, "picture": None, "picture_fullsize": None, - "has_variations": 4, + "has_variations": True, "allow_waitinglist": True, "mandatory_priced_addons": False, "description": None, @@ -284,7 +284,7 @@ class WidgetCartTest(CartTestMixin, TestCase): "includes_mixed_tax_rate": False}, "picture": None, "picture_fullsize": None, - "has_variations": 0, + "has_variations": False, "allow_waitinglist": True, "mandatory_priced_addons": False, "description": None, @@ -331,7 +331,7 @@ class WidgetCartTest(CartTestMixin, TestCase): "suggested_price": None, "picture": None, "picture_fullsize": None, - "has_variations": 4, + "has_variations": True, "allow_waitinglist": True, "mandatory_priced_addons": False, "description": None, @@ -399,7 +399,7 @@ class WidgetCartTest(CartTestMixin, TestCase): "suggested_price": {"gross": "23.00", "net": "19.33", "tax": "3.67", "name": "", "rate": "19.00", "includes_mixed_tax_rate": False}, "picture": None, "picture_fullsize": None, - "has_variations": 0, + "has_variations": False, "allow_waitinglist": True, "mandatory_priced_addons": False, "description": None, @@ -457,7 +457,7 @@ class WidgetCartTest(CartTestMixin, TestCase): 'picture': None, "picture_fullsize": None, 'description': None, - 'has_variations': 2, + 'has_variations': True, "allow_waitinglist": True, "mandatory_priced_addons": False, 'current_unavailability_reason': None,