API: Fix race conditions in OrderChangeSerializer (#5756)

* OrderPositionCreateForExistingOrderSerializer.create: Fix race condition

* OrderFeeCreateForExistingOrderSerializer.create: Fix race condition

* OrderChange API serializers: Fix import orders
This commit is contained in:
Luca Sorace "Stranck
2026-01-06 15:46:41 +01:00
committed by GitHub
parent 8cc12fa1c7
commit c78365ce43

View File

@@ -33,7 +33,7 @@ from pretix.api.serializers.order import (
OrderFeeCreateSerializer, OrderPositionCreateSerializer, OrderFeeCreateSerializer, OrderPositionCreateSerializer,
) )
from pretix.base.models import ItemVariation, Order, OrderFee, OrderPosition from pretix.base.models import ItemVariation, Order, OrderFee, OrderPosition
from pretix.base.services.orders import OrderError from pretix.base.services.orders import OrderChangeManager, OrderError
from pretix.base.settings import COUNTRIES_WITH_STATE_IN_ADDRESS from pretix.base.settings import COUNTRIES_WITH_STATE_IN_ADDRESS
logger = logging.getLogger(__name__) logger = logging.getLogger(__name__)
@@ -82,11 +82,11 @@ class OrderPositionCreateForExistingOrderSerializer(OrderPositionCreateSerialize
return data return data
def create(self, validated_data): def create(self, validated_data):
ocm = self.context['ocm'] ocm: OrderChangeManager = self.context['ocm']
check_quotas = self.context.get('check_quotas', True) check_quotas = self.context.get('check_quotas', True)
try: try:
ocm.add_position( new_position = ocm.add_position(
item=validated_data['item'], item=validated_data['item'],
variation=validated_data.get('variation'), variation=validated_data.get('variation'),
price=validated_data.get('price'), price=validated_data.get('price'),
@@ -98,7 +98,7 @@ class OrderPositionCreateForExistingOrderSerializer(OrderPositionCreateSerialize
) )
if self.context.get('commit', True): if self.context.get('commit', True):
ocm.commit(check_quotas=check_quotas) ocm.commit(check_quotas=check_quotas)
return validated_data['order'].positions.order_by('-positionid').first() return new_position.position
else: else:
return OrderPosition() # fake to appease DRF return OrderPosition() # fake to appease DRF
except OrderError as e: except OrderError as e:
@@ -131,7 +131,7 @@ class OrderFeeCreateForExistingOrderSerializer(OrderFeeCreateSerializer):
return data return data
def create(self, validated_data): def create(self, validated_data):
ocm = self.context['ocm'] ocm: OrderChangeManager = self.context['ocm']
try: try:
f = OrderFee( f = OrderFee(
@@ -146,7 +146,7 @@ class OrderFeeCreateForExistingOrderSerializer(OrderFeeCreateSerializer):
ocm.add_fee(f) ocm.add_fee(f)
if self.context.get('commit', True): if self.context.get('commit', True):
ocm.commit() ocm.commit()
return validated_data['order'].fees.order_by('-pk').first() return f
else: else:
return OrderFee() # fake to appease DRF return OrderFee() # fake to appease DRF
except OrderError as e: except OrderError as e:
@@ -310,7 +310,7 @@ class OrderPositionChangeSerializer(serializers.ModelSerializer):
return data return data
def update(self, instance, validated_data): def update(self, instance, validated_data):
ocm = self.context['ocm'] ocm: OrderChangeManager = self.context['ocm']
check_quotas = self.context.get('check_quotas', True) check_quotas = self.context.get('check_quotas', True)
current_seat = {'seat_guid': instance.seat.seat_guid} if instance.seat else None current_seat = {'seat_guid': instance.seat.seat_guid} if instance.seat else None
item = validated_data.get('item', instance.item) item = validated_data.get('item', instance.item)
@@ -399,7 +399,7 @@ class OrderFeeChangeSerializer(serializers.ModelSerializer):
) )
def update(self, instance, validated_data): def update(self, instance, validated_data):
ocm = self.context['ocm'] ocm: OrderChangeManager = self.context['ocm']
value = validated_data.get('value', instance.value) value = validated_data.get('value', instance.value)
try: try: