From dc298c42022528717094ddcd0e64c573a2f30f89 Mon Sep 17 00:00:00 2001 From: Raphael Michel Date: Wed, 11 Dec 2019 13:31:56 +0100 Subject: [PATCH] Bundle behaviour --- src/pretix/base/services/cart.py | 12 ++++++++- src/tests/presale/test_cart.py | 42 ++++++++++++++++++++++++++++++++ 2 files changed, 53 insertions(+), 1 deletion(-) diff --git a/src/pretix/base/services/cart.py b/src/pretix/base/services/cart.py index 6041414c4..51390f32a 100644 --- a/src/pretix/base/services/cart.py +++ b/src/pretix/base/services/cart.py @@ -450,7 +450,17 @@ class CartManager: if voucher.subevent_id and voucher.subevent_id != p.subevent_id: continue - price = self._get_price(p.item, p.variation, voucher, None, p.subevent) + if p.is_bundled: + continue + + bundled_sum = Decimal('0.00') + if not p.addon_to_id: + for bundledp in p.addons.all(): + if bundledp.is_bundled: + bundledprice = bundledp.price + bundled_sum += bundledprice + + price = self._get_price(p.item, p.variation, voucher, None, p.subevent, bundled_sum=bundled_sum) if price.gross > p.price: continue diff --git a/src/tests/presale/test_cart.py b/src/tests/presale/test_cart.py index 35701a4cf..1a1e5ef64 100644 --- a/src/tests/presale/test_cart.py +++ b/src/tests/presale/test_cart.py @@ -2857,6 +2857,48 @@ class CartBundleTest(CartTestMixin, TestCase): assert cp.price == 0 assert b.price == 40 + @classscope(attr='orga') + def test_voucher_apply_multiple(self): + cp = CartPosition.objects.create( + event=self.event, cart_id=self.session_key, item=self.ticket, + price=21.5, expires=now() + timedelta(minutes=10) + ) + b = CartPosition.objects.create( + event=self.event, cart_id=self.session_key, item=self.trans, addon_to=cp, + price=1.5, expires=now() + timedelta(minutes=10), is_bundled=True + ) + v = Voucher.objects.create( + event=self.event, price_mode='set', value=Decimal('4.00'), max_usages=100 + ) + + self.cm.apply_voucher(v.code) + self.cm.commit() + cp.refresh_from_db() + b.refresh_from_db() + assert cp.price == Decimal('2.50') + assert b.price == Decimal('1.50') + + @classscope(attr='orga') + def test_voucher_apply_multiple_reduce_beyond_designated_price(self): + cp = CartPosition.objects.create( + event=self.event, cart_id=self.session_key, item=self.ticket, + price=21.5, expires=now() + timedelta(minutes=10) + ) + b = CartPosition.objects.create( + event=self.event, cart_id=self.session_key, item=self.trans, addon_to=cp, + price=1.5, expires=now() + timedelta(minutes=10), is_bundled=True + ) + v = Voucher.objects.create( + event=self.event, price_mode='set', value=Decimal('0.00'), max_usages=100 + ) + + self.cm.apply_voucher(v.code) + self.cm.commit() + cp.refresh_from_db() + b.refresh_from_db() + assert cp.price == Decimal('0.00') + assert b.price == Decimal('1.50') + @classscope(attr='orga') def test_extend_base_price_changed(self): cp = CartPosition.objects.create(