in experimenter/experimenter/experiments/api/v5/serializers.py [0:0]
def update(self, experiment, data):
data.pop("reference_branch", None)
data.pop("treatment_branches", None)
branches_data = []
if (
reference_branch_data := self.initial_data.get("reference_branch")
) is not None:
branches_data.append(reference_branch_data)
if (
treatment_branches_data := self.initial_data.get("treatment_branches")
) is not None:
branches_data.extend(treatment_branches_data)
with transaction.atomic():
experiment = super().update(experiment, data)
if {"reference_branch", "treatment_branches"}.intersection(
set(self.initial_data.keys())
):
saved_branch_ids = set(
experiment.branches.all().values_list("id", flat=True)
)
updated_branch_ids = {b["id"] for b in branches_data if b.get("id")}
deleted_branch_ids = saved_branch_ids - updated_branch_ids
for deleted_branch_id in deleted_branch_ids:
NimbusBranch.objects.get(id=deleted_branch_id).delete()
for branch_data in branches_data:
branch = None
if branch_data.get("id") is not None:
branch = NimbusBranch.objects.get(id=branch_data["id"])
serializer = NimbusBranchSerializer(
instance=branch,
data=branch_data,
partial=True,
)
if serializer.is_valid(raise_exception=True):
branch = serializer.save(experiment=experiment)
if branch_data == reference_branch_data:
experiment.reference_branch = branch
experiment.save()
return experiment