def update()

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