From b92feb382b846c10ee28b174e9cdb88fe3fbe201 Mon Sep 17 00:00:00 2001 From: Raphael Michel Date: Wed, 29 Nov 2023 16:02:27 +0100 Subject: [PATCH] Discounts: Fix scoping error with distinct subevents --- src/pretix/base/models/discount.py | 7 ++++++- src/tests/base/test_pricing_discount.py | 25 +++++++++++++++++++++++++ 2 files changed, 31 insertions(+), 1 deletion(-) diff --git a/src/pretix/base/models/discount.py b/src/pretix/base/models/discount.py index f5683c6975..e93c754104 100644 --- a/src/pretix/base/models/discount.py +++ b/src/pretix/base/models/discount.py @@ -424,5 +424,10 @@ class Discount(LoggedModel): break for g in candidate_groups: - self._apply_min_count(positions, g, g, result) + self._apply_min_count( + positions, + [idx for idx in g if idx in condition_candidates], + [idx for idx in g if idx in benefit_candidates], + result + ) return result diff --git a/src/tests/base/test_pricing_discount.py b/src/tests/base/test_pricing_discount.py index dce8801053..b39dddf5f9 100644 --- a/src/tests/base/test_pricing_discount.py +++ b/src/tests/base/test_pricing_discount.py @@ -965,6 +965,31 @@ def test_limit_products(event, item, item2): assert sorted(new_prices) == sorted(expected) +@pytest.mark.django_db +@scopes_disabled() +def test_limit_products_subevents_distinct(event, item, item2): + d1 = Discount(event=event, condition_min_count=2, benefit_discount_matching_percent=20, condition_all_products=False, + subevent_mode=Discount.SUBEVENT_MODE_DISTINCT) + d1.save() + d1.condition_limit_products.add(item) + + positions = ( + (item.pk, 1, Decimal('100.00'), False, False, Decimal('0.00')), + (item.pk, 2, Decimal('100.00'), False, False, Decimal('0.00')), + (item.pk, 3, Decimal('100.00'), False, False, Decimal('0.00')), + (item2.pk, 4, Decimal('50.00'), False, False, Decimal('0.00')), + ) + expected = ( + Decimal('80.00'), + Decimal('80.00'), + Decimal('80.00'), + Decimal('50.00'), + ) + + new_prices = [p for p, d in apply_discounts(event, 'web', positions)] + assert sorted(new_prices) == sorted(expected) + + @pytest.mark.django_db @scopes_disabled() def test_sales_channels(event, item):