mirror of
https://github.com/pretix/pretix.git
synced 2026-08-27 13:24:41 +00:00
Fixed broken database transaction grouping
This commit is contained in:
@@ -377,6 +377,9 @@ class OrderPosition(AbstractPosition):
|
|||||||
answ.orderposition = op
|
answ.orderposition = op
|
||||||
answ.cartposition = None
|
answ.cartposition = None
|
||||||
answ.save()
|
answ.save()
|
||||||
|
if cartpos.voucher:
|
||||||
|
cartpos.voucher.redeemed = True
|
||||||
|
cartpos.voucher.save()
|
||||||
cartpos.delete()
|
cartpos.delete()
|
||||||
ops.append(op)
|
ops.append(op)
|
||||||
OrderPosition.objects.bulk_create(ops)
|
OrderPosition.objects.bulk_create(ops)
|
||||||
|
|||||||
@@ -140,8 +140,6 @@ def _check_positions(event: Event, dt: datetime, positions: List[CartPosition]):
|
|||||||
if cp.voucher.redeemed:
|
if cp.voucher.redeemed:
|
||||||
err = err or error_messages['voucher_redeemed']
|
err = err or error_messages['voucher_redeemed']
|
||||||
continue
|
continue
|
||||||
cp.voucher.redeemed = True
|
|
||||||
cp.voucher.save()
|
|
||||||
|
|
||||||
if cp.expires >= dt:
|
if cp.expires >= dt:
|
||||||
# Other checks are not necessary
|
# Other checks are not necessary
|
||||||
@@ -150,18 +148,18 @@ def _check_positions(event: Event, dt: datetime, positions: List[CartPosition]):
|
|||||||
price = cp.item.default_price if cp.variation is None else (
|
price = cp.item.default_price if cp.variation is None else (
|
||||||
cp.variation.default_price if cp.variation.default_price is not None else cp.item.default_price)
|
cp.variation.default_price if cp.variation.default_price is not None else cp.item.default_price)
|
||||||
|
|
||||||
if cp.voucher:
|
|
||||||
if cp.voucher.valid_until < now():
|
|
||||||
err = err or error_messages['voucher_expired']
|
|
||||||
continue
|
|
||||||
if price is not False and cp.voucher.price is not None:
|
|
||||||
price = cp.voucher.price
|
|
||||||
|
|
||||||
if price is False or len(quotas) == 0:
|
if price is False or len(quotas) == 0:
|
||||||
err = err or error_messages['unavailable']
|
err = err or error_messages['unavailable']
|
||||||
cp.delete()
|
cp.delete()
|
||||||
continue
|
continue
|
||||||
|
|
||||||
|
if cp.voucher:
|
||||||
|
if cp.voucher.valid_until < now():
|
||||||
|
err = err or error_messages['voucher_expired']
|
||||||
|
continue
|
||||||
|
if cp.voucher.price is not None:
|
||||||
|
price = cp.voucher.price
|
||||||
|
|
||||||
if price != cp.price:
|
if price != cp.price:
|
||||||
positions[i] = cp
|
positions[i] = cp
|
||||||
cp.price = price
|
cp.price = price
|
||||||
@@ -191,6 +189,7 @@ def _check_positions(event: Event, dt: datetime, positions: List[CartPosition]):
|
|||||||
raise OrderError(err)
|
raise OrderError(err)
|
||||||
|
|
||||||
|
|
||||||
|
@transaction.atomic()
|
||||||
def _create_order(event: Event, email: str, positions: List[CartPosition], dt: datetime,
|
def _create_order(event: Event, email: str, positions: List[CartPosition], dt: datetime,
|
||||||
payment_provider: BasePaymentProvider, locale: str=None):
|
payment_provider: BasePaymentProvider, locale: str=None):
|
||||||
total = sum([c.price for c in positions])
|
total = sum([c.price for c in positions])
|
||||||
@@ -234,10 +233,9 @@ def _perform_order(event: str, payment_provider: str, position_ids: List[str],
|
|||||||
id__in=position_ids).select_related('item', 'variation'))
|
id__in=position_ids).select_related('item', 'variation'))
|
||||||
if len(position_ids) != len(positions):
|
if len(position_ids) != len(positions):
|
||||||
raise OrderError(error_messages['internal'])
|
raise OrderError(error_messages['internal'])
|
||||||
with transaction.atomic():
|
_check_positions(event, dt, positions)
|
||||||
_check_positions(event, dt, positions)
|
order = _create_order(event, email, positions, dt, pprov,
|
||||||
order = _create_order(event, email, positions, dt, pprov,
|
locale=locale)
|
||||||
locale=locale)
|
|
||||||
|
|
||||||
mail(
|
mail(
|
||||||
order.email, _('Your order: %(code)s') % {'code': order.code},
|
order.email, _('Your order: %(code)s') % {'code': order.code},
|
||||||
|
|||||||
Reference in New Issue
Block a user