From f23de7e2c0be3c981dc89eb08beb6db958fcae79 Mon Sep 17 00:00:00 2001 From: Raphael Michel Date: Mon, 11 Feb 2019 16:15:54 +0100 Subject: [PATCH] Order change: Allow to ignore quotas --- src/pretix/base/services/orders.py | 5 +++-- src/pretix/control/forms/orders.py | 4 ++++ .../control/templates/pretixcontrol/order/change.html | 3 +++ src/pretix/control/views/orders.py | 2 +- src/tests/base/test_orders.py | 8 ++++++++ 5 files changed, 19 insertions(+), 3 deletions(-) diff --git a/src/pretix/base/services/orders.py b/src/pretix/base/services/orders.py index 8eac8ded08..4ed89e9583 100644 --- a/src/pretix/base/services/orders.py +++ b/src/pretix/base/services/orders.py @@ -1306,7 +1306,7 @@ class OrderChangeManager: except SendMailException: logger.exception('Order changed email could not be sent') - def commit(self): + def commit(self, check_quotas=True): if self._committed: # an order change can only be committed once raise OrderError(error_messages['internal']) @@ -1323,7 +1323,8 @@ class OrderChangeManager: with self.order.event.lock(): if self.order.status not in (Order.STATUS_PENDING, Order.STATUS_PAID): raise OrderError(self.error_messages['not_pending_or_paid']) - self._check_quotas() + if check_quotas: + self._check_quotas() self._check_complete_cancel() self._perform_operations() self._recalculate_total_and_payment_fee() diff --git a/src/pretix/control/forms/orders.py b/src/pretix/control/forms/orders.py index 78b441acd9..37eee6d3d7 100644 --- a/src/pretix/control/forms/orders.py +++ b/src/pretix/control/forms/orders.py @@ -177,6 +177,10 @@ class OtherOperationsForm(forms.Form): 'Send an email to the customer notifying that their order has been changed.' ) ) + ignore_quotas = forms.BooleanField( + label=_('Allow to overbook quotas when performing this operation'), + required=False, + ) def __init__(self, *args, **kwargs): kwargs.pop('order') diff --git a/src/pretix/control/templates/pretixcontrol/order/change.html b/src/pretix/control/templates/pretixcontrol/order/change.html index 9958d29c71..48f51fe7e6 100644 --- a/src/pretix/control/templates/pretixcontrol/order/change.html +++ b/src/pretix/control/templates/pretixcontrol/order/change.html @@ -206,6 +206,9 @@ +
+ {% bootstrap_field other_form.ignore_quotas layout="" %} +
diff --git a/src/pretix/control/views/orders.py b/src/pretix/control/views/orders.py index 3a91533d8c..2064bbe491 100644 --- a/src/pretix/control/views/orders.py +++ b/src/pretix/control/views/orders.py @@ -1259,7 +1259,7 @@ class OrderChange(OrderView): messages.error(self.request, _('An error occurred. Please see the details below.')) else: try: - ocm.commit() + ocm.commit(check_quotas=not self.other_form.cleaned_data['ignore_quotas']) except OrderError as e: messages.error(self.request, str(e)) else: diff --git a/src/tests/base/test_orders.py b/src/tests/base/test_orders.py index 749ec1c77d..901b8427ea 100644 --- a/src/tests/base/test_orders.py +++ b/src/tests/base/test_orders.py @@ -816,6 +816,14 @@ class OrderChangeManagerTests(TestCase): self.op1.refresh_from_db() assert self.op1.item == self.ticket + def test_quota_ignore(self): + q = self.event.quotas.create(name='Test', size=0) + q.items.add(self.shirt) + self.ocm.change_item(self.op1, self.shirt, None) + self.ocm.commit(check_quotas=False) + self.op1.refresh_from_db() + assert self.op1.item == self.shirt + def test_quota_full_but_in_same(self): q = self.event.quotas.create(name='Test', size=0) q.items.add(self.shirt)