@@ -435,9 +435,20 @@ def create(self, validated_data):
435435 with transaction .atomic ():
436436 event = super ().create (validated_data )
437437 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 )
438+ permission_groups = pool .get ("permission_groups" , [])
439+ pool_data = {
440+ "name" : pool .get ("name" ),
441+ "capacity" : pool .get ("capacity" ),
442+ "activation_date" : pool .get ("activation_date" ),
443+ "permission_groups" : [
444+ getattr (gr , "id" , gr ) for gr in permission_groups
445+ ],
446+ }
447+ pool_serializer = PoolCreateAndUpdateSerializer (
448+ data = pool_data , context = {** self .context , "event" : event }
449+ )
450+ pool_serializer .is_valid (raise_exception = True )
451+ pool_serializer .save ()
441452 return event
442453
443454 def update (self , instance , validated_data ):
@@ -454,24 +465,40 @@ def update(self, instance, validated_data):
454465 pools [0 ]["capacity" ] = 0
455466 with transaction .atomic ():
456467 if pools is not None :
457- existing_pools = list (instance .pools . all () .values_list ("id" , flat = True ))
468+ existing_ids = set (instance .pools .values_list ("id" , flat = True ))
458469 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 ()
470+ pool_id = pool .get ("id" )
471+ pool_instance = (
472+ Pool .objects .filter (id = pool_id , event = instance )
473+ .select_for_update ()
474+ .first ()
475+ if pool_id
476+ else None
477+ )
478+ if pool_instance :
479+ existing_ids .discard (pool_id )
480+ permission_groups = pool .get ("permission_groups" , [])
481+ pool_data = {
482+ "name" : pool .get ("name" ),
483+ "capacity" : pool .get ("capacity" ),
484+ "activation_date" : pool .get ("activation_date" ),
485+ "permission_groups" : [
486+ getattr (gr , "id" , gr ) for gr in permission_groups
487+ ],
488+ }
489+ pool_serializer = PoolCreateAndUpdateSerializer (
490+ instance = pool_instance ,
491+ data = pool_data ,
492+ context = {** self .context , "event" : instance },
493+ partial = True ,
494+ )
495+ pool_serializer .is_valid (raise_exception = True )
496+ pool_serializer .save ()
497+ if existing_ids :
498+ for pool_obj in Pool .objects .filter (
499+ event = instance , id__in = existing_ids
500+ ).iterator ():
501+ pool_obj .delete ()
475502 return super ().update (instance , validated_data )
476503
477504
0 commit comments