From 82704b60c71ca5da785ebeca8fe39f11b6a5c191 Mon Sep 17 00:00:00 2001 From: Raphael Michel Date: Wed, 29 Nov 2023 16:08:50 +0100 Subject: [PATCH] Voucher form: Fix quota check for partially redeemed vouchers --- src/pretix/control/forms/vouchers.py | 2 ++ src/tests/control/test_vouchers.py | 13 +++++++++++++ 2 files changed, 15 insertions(+) diff --git a/src/pretix/control/forms/vouchers.py b/src/pretix/control/forms/vouchers.py index 0baeab2ce6..4b53a35994 100644 --- a/src/pretix/control/forms/vouchers.py +++ b/src/pretix/control/forms/vouchers.py @@ -201,6 +201,8 @@ class VoucherForm(I18nModelForm): cnt = len(data['codes']) * data.get('max_usages', 0) else: cnt = data.get('max_usages', 0) + if self.instance and self.instance.pk: + cnt -= self.instance.redeemed # these do not need quota any more Voucher.clean_item_properties( data, self.instance.event, diff --git a/src/tests/control/test_vouchers.py b/src/tests/control/test_vouchers.py index b2fe0c2793..ce587e43f1 100644 --- a/src/tests/control/test_vouchers.py +++ b/src/tests/control/test_vouchers.py @@ -365,6 +365,19 @@ class VoucherFormTest(SoupTestMixin, TransactionTestCase): v.refresh_from_db() assert v.valid_until < now() + def test_change_voucher_validity_to_valid_quota_full_already_redeemed(self): + self.quota_tickets.size = 1 + self.quota_tickets.save() + with scopes_disabled(): + v = self.event.vouchers.create(item=self.ticket, valid_until=now() - datetime.timedelta(days=3), + block_quota=True, redeemed=1, max_usages=2) + self._change_voucher(v, { + 'valid_until_0': (now() + datetime.timedelta(days=3)).strftime('%Y-%m-%d'), + 'valid_until_1': (now() + datetime.timedelta(days=3)).strftime('%H:%M:%S') + }) + v.refresh_from_db() + assert v.valid_until > now() + def test_change_voucher_validity_to_valid_quota_free(self): with scopes_disabled(): v = self.event.vouchers.create(item=self.ticket, valid_until=now() - datetime.timedelta(days=3),