@@ -454,24 +454,43 @@ def update(self, instance, validated_data):
454454 pools [0 ]["capacity" ] = 0
455455 with transaction .atomic ():
456456 if pools is not None :
457- existing_pools = list (instance .pools . all () .values_list ("id" , flat = True ))
457+ existing_ids = set (instance .pools .values_list ("id" , flat = True ))
458458 for pool in pools :
459459 pool_id = pool .get ("id" , None )
460- if pool_id in existing_pools :
461- existing_pools .remove (pool_id )
462460 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 ()
461+ perm_ids = [getattr (g , "id" , g ) for g in permission_groups ]
462+ pool_instance = None
463+ if pool_id :
464+ pool_instance = (
465+ Pool .objects .filter (id = pool_id , event = instance )
466+ .select_for_update ()
467+ .first ()
468+ )
469+ existing_ids .discard (pool_id )
470+ pool_data = {
471+ "name" : pool .get ("name" , getattr (pool_instance , "name" , None )),
472+ "capacity" : pool .get (
473+ "capacity" , getattr (pool_instance , "capacity" , 0 )
474+ ),
475+ "activation_date" : pool .get (
476+ "activation_date" ,
477+ getattr (pool_instance , "activation_date" , None ),
478+ ),
479+ "permission_groups" : perm_ids ,
480+ }
481+ ser = PoolCreateAndUpdateSerializer (
482+ instance = pool_instance ,
483+ data = pool_data ,
484+ context = {** self .context , "event" : instance },
485+ partial = True ,
486+ )
487+ ser .is_valid (raise_exception = True )
488+ ser .save ()
489+ if existing_ids :
490+ for p in Pool .objects .filter (
491+ event = instance , id__in = existing_ids
492+ ).iterator ():
493+ p .delete ()
475494 return super ().update (instance , validated_data )
476495
477496
0 commit comments