@@ -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