From c2d5d40be6bacfeef8561cf2c2d847bab9a5976b Mon Sep 17 00:00:00 2001 From: Raphael Michel Date: Thu, 22 May 2025 16:04:50 +0200 Subject: [PATCH] OrderChangeManager: Respect addons on cancellation check (Z#23193427) (#5132) * OrderChangeManager: Respect addons on cancellation check (Z#23193427) * Update src/tests/base/test_orders.py Co-authored-by: luelista --------- Co-authored-by: luelista --- src/pretix/base/services/orders.py | 6 +++++- src/tests/base/test_orders.py | 10 +++++++++- 2 files changed, 14 insertions(+), 2 deletions(-) diff --git a/src/pretix/base/services/orders.py b/src/pretix/base/services/orders.py index 56c75ad545..32d14da3e8 100644 --- a/src/pretix/base/services/orders.py +++ b/src/pretix/base/services/orders.py @@ -2768,7 +2768,11 @@ class OrderChangeManager: def _check_complete_cancel(self): current = self.order.positions.count() - cancels = len([o for o in self._operations if isinstance(o, (self.CancelOperation, self.SplitOperation))]) + cancels = sum([ + 1 + o.position.addons.count() for o in self._operations if isinstance(o, self.CancelOperation) + ]) + len([ + o for o in self._operations if isinstance(o, self.SplitOperation) + ]) adds = len([o for o in self._operations if isinstance(o, self.AddOperation)]) if current > 0 and current - cancels + adds < 1: raise OrderError(self.error_messages['complete_cancel']) diff --git a/src/tests/base/test_orders.py b/src/tests/base/test_orders.py index 238da5c1cd..b705bc22ed 100644 --- a/src/tests/base/test_orders.py +++ b/src/tests/base/test_orders.py @@ -1759,11 +1759,19 @@ class OrderChangeManagerTests(TestCase): @classscope(attr='o') def test_cancel_all_in_order(self): + self.shirt.category = self.event.categories.create(name='Add-ons', is_addon=True) + self.ticket.addons.create(addon_category=self.shirt.category) + self.ocm.add_position(self.shirt, None, Decimal('13.00'), addon_to=self.op1) + self.ocm.commit() + self.order.refresh_from_db() + self.ocm = OrderChangeManager(self.order, None) + + assert self.order.positions.count() == 3 self.ocm.cancel(self.op1) self.ocm.cancel(self.op2) with self.assertRaises(OrderError): self.ocm.commit() - assert self.order.positions.count() == 2 + assert self.order.positions.count() == 3 @classscope(attr='o') def test_empty(self):