diff --git a/src/pretix/presale/views/event.py b/src/pretix/presale/views/event.py index da4640cd0..27045ac9d 100644 --- a/src/pretix/presale/views/event.py +++ b/src/pretix/presale/views/event.py @@ -293,6 +293,8 @@ def get_grouped_items(event, *, channel: SalesChannel, subevent=None, voucher=No max_per_order = sys.maxsize else: max_per_order = item.max_per_order or int(event.settings.max_items_per_order) + if voucher: + max_per_order = min(max_per_order, voucher.max_usages - voucher.redeemed) if item.hidden_if_available: q = item.hidden_if_available.availability(_cache=quota_cache) diff --git a/src/tests/presale/test_widget.py b/src/tests/presale/test_widget.py index 20129b3a4..ac606dacc 100644 --- a/src/tests/presale/test_widget.py +++ b/src/tests/presale/test_widget.py @@ -367,7 +367,7 @@ class WidgetCartTest(CartTestMixin, TestCase): def test_product_list_view_with_voucher(self): with scopes_disabled(): - self.event.vouchers.create(item=self.ticket, code="ABCDE") + self.event.vouchers.create(item=self.ticket, code="ABCDE", max_usages=1) response = self.client.get('/%s/%s/widget/product_list?voucher=ABCDE' % (self.orga.slug, self.event.slug)) assert response['Access-Control-Allow-Origin'] == '*' data = json.loads(response.content.decode()) @@ -410,7 +410,7 @@ class WidgetCartTest(CartTestMixin, TestCase): "free_price": False, "original_price": None, "name": "Early-bird ticket", - "order_max": 4 + "order_max": 1 }, ], "description": None, @@ -426,7 +426,7 @@ class WidgetCartTest(CartTestMixin, TestCase): def test_product_list_view_with_voucher_variation_through_quota(self): with scopes_disabled(): - self.event.vouchers.create(quota=self.quota_shirts, code="ABCDE") + self.event.vouchers.create(quota=self.quota_shirts, code="ABCDE", max_usages=1) self.quota_shirts.variations.remove(self.shirt_blue) response = self.client.get('/%s/%s/widget/product_list?voucher=ABCDE' % (self.orga.slug, self.event.slug)) assert response['Access-Control-Allow-Origin'] == '*' @@ -474,7 +474,7 @@ class WidgetCartTest(CartTestMixin, TestCase): { 'id': self.shirt_red.pk, 'value': 'Red', - 'order_max': 2, + 'order_max': 1, 'description': None, 'original_price': None, 'price': {