From 58db550e239f4c9c9d492186198551c269b7c303 Mon Sep 17 00:00:00 2001 From: Raphael Michel Date: Mon, 3 Feb 2025 17:07:19 +0100 Subject: [PATCH] Do not allow to cancel pending payments by default (Z#23179178) --- src/pretix/base/payment.py | 11 +++++++++-- src/tests/plugins/banktransfer/test_import.py | 2 +- 2 files changed, 10 insertions(+), 3 deletions(-) diff --git a/src/pretix/base/payment.py b/src/pretix/base/payment.py index 81fa9b9e71..69bea13597 100644 --- a/src/pretix/base/payment.py +++ b/src/pretix/base/payment.py @@ -957,12 +957,19 @@ class BasePaymentProvider: def cancel_payment(self, payment: OrderPayment): """ - Will be called to cancel a payment. The default implementation just sets the payment state to canceled, - but in some cases you might want to notify an external provider. + Will be called to cancel a payment. The default implementation fails if the payment is + ``OrderPayment.PAYMENT_STATE_PENDING`` and ``abort_pending_allowed`` is false. Otherwise, it just sets the + payment state to canceled. In some cases you might want to modify this behaviour to notify the external provider + of the cancellation. On success, you should set ``payment.state = OrderPayment.PAYMENT_STATE_CANCELED`` (or call the super method). On failure, you should raise a PaymentException. """ + if payment.state == OrderPayment.PAYMENT_STATE_PENDING and not self.abort_pending_allowed: + raise PaymentException(_( + "This payment is already being processed and can not be canceled any more." + )) + payment.state = OrderPayment.PAYMENT_STATE_CANCELED payment.save(update_fields=['state']) diff --git a/src/tests/plugins/banktransfer/test_import.py b/src/tests/plugins/banktransfer/test_import.py index 05e2a76b87..49a7f8db37 100644 --- a/src/tests/plugins/banktransfer/test_import.py +++ b/src/tests/plugins/banktransfer/test_import.py @@ -574,7 +574,7 @@ def test_pending_paypal_drop_fee(env, job): env[2].save() p = env[2].payments.create( provider='paypal', - state=OrderPayment.PAYMENT_STATE_PENDING, + state=OrderPayment.PAYMENT_STATE_CREATED, fee=fee, amount=env[2].total )