@@ -423,57 +423,75 @@ 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+
427+ pools = self ._pools_for_status (event_status_type , pools )
426428 require_auth = validated_data .get ("require_auth" , False )
427429 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
430+
435431 with transaction .atomic ():
436432 event = super ().create (validated_data )
437433 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 )
434+ pool_data = PoolCreateAndUpdateSerializer .extract_pool_data (pool )
435+ pool_serializer = PoolCreateAndUpdateSerializer (
436+ data = pool_data , context = {** self .context , "event" : event }
437+ )
438+ pool_serializer .is_valid (raise_exception = True )
439+ pool_serializer .save ()
441440 return event
442441
443442 def update (self , instance , validated_data ):
444443 pools = validated_data .pop ("pools" , None )
445444 event_status_type = validated_data .get (
446445 "event_status_type" , Event ._meta .get_field ("event_status_type" ).default
447446 )
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
447+
448+ pools = self ._pools_for_status (event_status_type , pools )
449+
455450 with transaction .atomic ():
456451 if pools is not None :
457- existing_pools = list (instance .pools . all () .values_list ("id" , flat = True ))
452+ existing_ids = set (instance .pools .values_list ("id" , flat = True ))
458453 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 ()
454+ pool_id = pool .get ("id" )
455+ pool_instance = (
456+ Pool .objects .filter (id = pool_id , event = instance )
457+ .select_for_update ()
458+ .first ()
459+ if pool_id
460+ else None
461+ )
462+ if pool_instance :
463+ existing_ids .discard (pool_id )
464+
465+ pool_data = PoolCreateAndUpdateSerializer .extract_pool_data (pool )
466+ pool_serializer = PoolCreateAndUpdateSerializer (
467+ instance = pool_instance ,
468+ data = pool_data ,
469+ context = {** self .context , "event" : instance },
470+ partial = True ,
471+ )
472+ pool_serializer .is_valid (raise_exception = True )
473+ pool_serializer .save ()
474+
475+ if existing_ids :
476+ for pool_obj in Pool .objects .filter (
477+ event = instance , id__in = existing_ids
478+ ).iterator ():
479+ pool_obj .delete ()
480+
475481 return super ().update (instance , validated_data )
476482
483+ def _pools_for_status (self , event_status_type , pools ):
484+ if pools is None :
485+ return None
486+ if event_status_type in (constants .TBA , constants .OPEN ):
487+ return []
488+ if event_status_type == constants .INFINITE :
489+ if not pools :
490+ return []
491+ pools = [pools [0 ]]
492+ pools [0 ]["capacity" ] = 0
493+ return pools
494+
477495
478496class FrontpageEventSerializer (serializers .ModelSerializer ):
479497 cover = ImageField (required = False , options = {"height" : 500 })
0 commit comments