diff --git a/src/pretix/base/models/vouchers.py b/src/pretix/base/models/vouchers.py index 0920718d5..104d2088a 100644 --- a/src/pretix/base/models/vouchers.py +++ b/src/pretix/base/models/vouchers.py @@ -162,10 +162,12 @@ class Voucher(LoggedModel): def is_ordered(self) -> int: """ - Returns whether an order position exists that uses this voucher. + Returns whether a non-canceled order position exists that uses this voucher. """ return OrderPosition.objects.filter( voucher=self + ).exclude( + order__status=Order.STATUS_CANCELLED ).exists() def is_in_cart(self) -> int: diff --git a/src/pretix/base/services/orders.py b/src/pretix/base/services/orders.py index f4949f1af..935d4023d 100644 --- a/src/pretix/base/services/orders.py +++ b/src/pretix/base/services/orders.py @@ -152,6 +152,11 @@ def cancel_order(order, user=None): if i: generate_cancellation(i) + for position in order.positions.all(): + if position.voucher: + position.voucher.redeemed = False + position.voucher.save() + return order