Fix transaction creation issues and improve debugging

This commit is contained in:
Raphael Michel
2021-10-26 11:33:44 +02:00
parent 5ea8a8ef82
commit 2dceff1218
2 changed files with 23 additions and 24 deletions
+4 -4
View File
@@ -60,10 +60,10 @@ def _check_for_dirty_orders():
dirty_transactions.order_ids = set() dirty_transactions.order_ids = set()
if dirty_transactions.order_ids and dirty_transactions.order_ids != {None}: if dirty_transactions.order_ids and dirty_transactions.order_ids != {None}:
_fail( _fail(
"In the transaction that just ended, you created or modified an Order, OrderPosition, or OrderFee " f"In the transaction that just ended, you created or modified an Order, OrderPosition, or OrderFee "
"object in a way that you should have called `order.create_transactions()` afterwards. The transaction " f"object in a way that you should have called `order.create_transactions()` afterwards. The transaction "
"still went through and your data can be fixed with the `create_order_transactions` management command " f"still went through and your data can be fixed with the `create_order_transactions` management command "
"but you should update your code to prevent this from happening." f"but you should update your code to prevent this from happening. Affected order IDs: {dirty_transactions.order_ids}"
) )
dirty_transactions.order_ids.clear() dirty_transactions.order_ids.clear()
+19 -20
View File
@@ -1561,17 +1561,16 @@ class OrderChangeManager:
self.order.save() self.order.save()
elif self.open_payment: elif self.open_payment:
try: try:
with transaction.atomic(): self.open_payment.payment_provider.cancel_payment(self.open_payment)
self.open_payment.payment_provider.cancel_payment(self.open_payment) self.order.log_action(
self.order.log_action( 'pretix.event.order.payment.canceled',
'pretix.event.order.payment.canceled', {
{ 'local_id': self.open_payment.local_id,
'local_id': self.open_payment.local_id, 'provider': self.open_payment.provider,
'provider': self.open_payment.provider, },
}, user=self.user,
user=self.user, auth=self.auth
auth=self.auth )
)
except PaymentException as e: except PaymentException as e:
self.order.log_action( self.order.log_action(
'pretix.event.order.payment.canceled.failed', 'pretix.event.order.payment.canceled.failed',
@@ -1586,12 +1585,11 @@ class OrderChangeManager:
elif self.order.status in (Order.STATUS_PENDING, Order.STATUS_EXPIRED) and self._totaldiff > 0: elif self.order.status in (Order.STATUS_PENDING, Order.STATUS_EXPIRED) and self._totaldiff > 0:
if self.open_payment: if self.open_payment:
try: try:
with transaction.atomic(): self.open_payment.payment_provider.cancel_payment(self.open_payment)
self.open_payment.payment_provider.cancel_payment(self.open_payment) self.order.log_action('pretix.event.order.payment.canceled', {
self.order.log_action('pretix.event.order.payment.canceled', { 'local_id': self.open_payment.local_id,
'local_id': self.open_payment.local_id, 'provider': self.open_payment.provider,
'provider': self.open_payment.provider, }, user=self.user, auth=self.auth)
}, user=self.user, auth=self.auth)
except PaymentException as e: except PaymentException as e:
self.order.log_action( self.order.log_action(
'pretix.event.order.payment.canceled.failed', 'pretix.event.order.payment.canceled.failed',
@@ -2131,11 +2129,11 @@ class OrderChangeManager:
self._recalculate_total_and_payment_fee() self._recalculate_total_and_payment_fee()
if self.order.status in (Order.STATUS_PENDING, Order.STATUS_PAID): if self.order.status in (Order.STATUS_PENDING, Order.STATUS_PAID):
self._reissue_invoice() self._reissue_invoice()
self._check_paid_price_change()
self._check_paid_to_free()
self._clear_tickets_cache() self._clear_tickets_cache()
self.order.create_transactions()
self.order.touch() self.order.touch()
self._check_paid_price_change() self.order.create_transactions()
self._check_paid_to_free()
if self.notify: if self.notify:
notify_user_changed_order( notify_user_changed_order(
@@ -2409,6 +2407,7 @@ def change_payment_provider(order: Order, payment_provider, amount=None, new_pay
generate_cancellation(i) generate_cancellation(i)
generate_invoice(order) generate_invoice(order)
order.create_transactions()
return old_fee, new_fee, fee, new_payment return old_fee, new_fee, fee, new_payment