@@ -423,57 +423,70 @@ def create(self, validated_data):
423423 event_status_type = validated_data .get (
424424 "event_status_type" , Event ._meta .get_field ("event_status_type" ).default
425425 )
426+ pools = self ._pools_for_status (event_status_type , pools )
426427 require_auth = validated_data .get ("require_auth" , False )
427428 validated_data ["require_auth" ] = require_auth
428- if event_status_type == constants .TBA :
429- pools = []
430- elif event_status_type == constants .OPEN :
431- pools = []
432- elif event_status_type == constants .INFINITE :
433- pools = [pools [0 ]]
434- pools [0 ]["capacity" ] = 0
435429 with transaction .atomic ():
436430 event = super ().create (validated_data )
437431 for pool in pools :
438- permission_groups = pool .pop ("permission_groups" )
439- created_pool = Pool .objects .create (event = event , ** pool )
440- created_pool .permission_groups .set (permission_groups )
432+ pool_data = PoolCreateAndUpdateSerializer .extract_pool_data (pool )
433+ pool_serializer = PoolCreateAndUpdateSerializer (
434+ data = pool_data , context = {** self .context , "event" : event }
435+ )
436+ pool_serializer .is_valid (raise_exception = True )
437+ pool_serializer .save ()
441438 return event
442439
443440 def update (self , instance , validated_data ):
444441 pools = validated_data .pop ("pools" , None )
445442 event_status_type = validated_data .get (
446443 "event_status_type" , Event ._meta .get_field ("event_status_type" ).default
447444 )
448- if event_status_type == constants .TBA :
449- pools = []
450- elif event_status_type == constants .OPEN :
451- pools = []
452- elif event_status_type == constants .INFINITE :
453- pools = [pools [0 ]]
454- pools [0 ]["capacity" ] = 0
445+ pools = self ._pools_for_status (event_status_type , pools )
455446 with transaction .atomic ():
456447 if pools is not None :
457- existing_pools = list (instance .pools . all () .values_list ("id" , flat = True ))
448+ existing_ids = set (instance .pools .values_list ("id" , flat = True ))
458449 for pool in pools :
459- pool_id = pool .get ("id" , None )
460- if pool_id in existing_pools :
461- existing_pools .remove (pool_id )
462- permission_groups = pool .pop ("permission_groups" )
463- created_pool = Pool .objects .update_or_create (
464- event = instance ,
465- id = pool_id ,
466- defaults = {
467- "name" : pool .get ("name" ),
468- "capacity" : pool .get ("capacity" , 0 ),
469- "activation_date" : pool .get ("activation_date" ),
470- },
471- )[0 ]
472- created_pool .permission_groups .set (permission_groups )
473- for pool_id in existing_pools :
474- Pool .objects .get (id = pool_id ).delete ()
450+ pool_id = pool .get ("id" )
451+ pool_instance = (
452+ Pool .objects .filter (id = pool_id , event = instance )
453+ .select_for_update ()
454+ .first ()
455+ if pool_id
456+ else None
457+ )
458+ if pool_instance :
459+ existing_ids .discard (pool_id )
460+
461+ pool_data = PoolCreateAndUpdateSerializer .extract_pool_data (pool )
462+ pool_serializer = PoolCreateAndUpdateSerializer (
463+ instance = pool_instance ,
464+ data = pool_data ,
465+ context = {** self .context , "event" : instance },
466+ partial = True ,
467+ )
468+ pool_serializer .is_valid (raise_exception = True )
469+ pool_serializer .save ()
470+
471+ if existing_ids :
472+ for pool_obj in Pool .objects .filter (
473+ event = instance , id__in = existing_ids
474+ ).iterator ():
475+ pool_obj .delete ()
475476 return super ().update (instance , validated_data )
476477
478+ def _pools_for_status (self , event_status_type , pools ):
479+ if pools is None :
480+ return None
481+ if event_status_type in (constants .TBA , constants .OPEN ):
482+ return []
483+ if event_status_type == constants .INFINITE :
484+ if not pools :
485+ return []
486+ pools = [pools [0 ]]
487+ pools [0 ]["capacity" ] = 0
488+ return pools
489+
477490
478491class FrontpageEventSerializer (serializers .ModelSerializer ):
479492 cover = ImageField (required = False , options = {"height" : 500 })
0 commit comments