Compare commits

...
Author SHA1 Message Date
Richard Schreiber f9e5c77b58 fix tests 2026-10-08 10:52:30 +02:00
Richard Schreiber 65285b7b5f Fix handling unknown payment provider 2026-10-07 09:06:37 +02:00
4 changed files with 40 additions and 5 deletions
+7
View File
@@ -678,6 +678,13 @@ def _cancel_order(order, user=None, send_mail: bool=True, api_token=None, device
for p in order.payments.filter(state__in=(OrderPayment.PAYMENT_STATE_CREATED, OrderPayment.PAYMENT_STATE_PENDING)):
try:
if not p.payment_provider:
raise PaymentException(
_("The payment {payment} could not be canceled as the payment provider ({provider}) is not available anymore.").format(
payment=str(p),
provider=p.provider
)
)
with transaction.atomic():
p.payment_provider.cancel_payment(p)
order.log_action(
+27
View File
@@ -874,6 +874,13 @@ class OrderPaymentCancel(OrderView):
def post(self, *args, **kwargs):
if self.payment.state in (OrderPayment.PAYMENT_STATE_CREATED, OrderPayment.PAYMENT_STATE_PENDING):
try:
if not self.payment.payment_provider:
raise PaymentException(
_('The payment {payment} can not be canceled as the payment provider "{provider}" is not available anymore.').format(
payment=str(self.payment),
provider=self.payment.provider
)
)
with transaction.atomic():
self.payment.payment_provider.cancel_payment(self.payment)
self.order.log_action('pretix.event.order.payment.canceled', {
@@ -898,6 +905,16 @@ class OrderPaymentCancel(OrderView):
return redirect(self.get_order_url())
def get(self, *args, **kwargs):
if not self.payment.payment_provider:
messages.error(
self.request,
_('The payment {payment} can not be canceled as the payment provider "{provider}" is not available anymore.').format(
payment=str(self.payment),
provider=self.payment.provider
)
)
return redirect(self.get_order_url())
return render(self.request, 'pretixcontrol/order/pay_cancel.html', {
'order': self.order,
})
@@ -1077,6 +1094,16 @@ class OrderPaymentConfirm(OrderView):
return redirect(self.get_order_url())
def get(self, *args, **kwargs):
if not self.payment.payment_provider:
messages.error(
self.request,
_('The payment {payment} can not be confirmend as the payment provider "{provider}" is not available anymore.').format(
payment=str(self.payment),
provider=self.payment.provider
)
)
return redirect(self.get_order_url())
return render(self.request, 'pretixcontrol/order/pay_complete.html', {
'form': self.mark_paid_form,
'order': self.order,
+4 -3
View File
@@ -355,10 +355,11 @@ class OrderDetails(EventViewMixin, OrderDetailMixin, CartMixin, TicketPageMixin,
ctx['last_payment'] = lp
pp = lp.payment_provider
ctx['last_payment_info'] = pp.payment_pending_render(self.request, ctx['last_payment'])
if pp:
ctx['last_payment_info'] = pp.payment_pending_render(self.request, ctx['last_payment'])
if lp.state == OrderPayment.PAYMENT_STATE_PENDING and not pp._payment_abort_pending_allowed(lp):
ctx['can_pay'] = False
if lp.state == OrderPayment.PAYMENT_STATE_PENDING and not pp._payment_abort_pending_allowed(lp):
ctx['can_pay'] = False
ctx['can_pay'] = ctx['can_pay'] and self.order._can_be_paid() is True
+2 -2
View File
@@ -74,13 +74,13 @@ def order(item):
datetime=now())
OrderPosition.objects.create(order=o, item=item, price=13)
p1 = o.payments.create(
provider='stripe',
provider='manual',
state='refunded',
amount=Decimal('23.00'),
payment_date=o.datetime,
)
o.refunds.create(
provider='stripe',
provider='manual',
state='done',
source='admin',
amount=Decimal('23.00'),