def validate()

in experimenter/experimenter/experiments/api/v5/serializers.py [0:0]


    def validate(self, data):
        data = super().validate(data)

        update_exempt_fields = TransitionConstants.STATUS_UPDATE_EXEMPT_FIELDS
        if self.instance:
            restrictive_statuses = set()
            exempt_fields = set()
            fields = ["all"]
            (
                fields.append("rollouts")
                if self.instance.is_rollout
                else fields.append("experiments")
            )

            restrictions = {
                "status": TransitionConstants.STATUS_ALLOWS_UPDATE,
                "publish_status": TransitionConstants.PUBLISH_STATUS_ALLOWS_UPDATE,
            }
            for f in fields:
                if update_exempt_fields[f] != []:
                    exempt_fields = exempt_fields.union(update_exempt_fields[f])
                for status in restrictions:
                    restrictive_statuses = restrictive_statuses.union(
                        restrictions[status][f]
                    )

            for status_field in restrictive_statuses:
                current_status = self.instance.status
                is_locked = current_status not in restrictive_statuses
                modifying_fields = set(data.keys()) - exempt_fields
                is_modifying_locked_fields = set(data.keys()).issubset(modifying_fields)

                if is_locked and is_modifying_locked_fields:
                    raise serializers.ValidationError(
                        {
                            "experiment": [
                                f"Nimbus Experiment has {status_field} "
                                f"'{current_status}', only "
                                f"{update_exempt_fields} "
                                f"can be changed, not: {modifying_fields}"
                            ]
                        }
                    )
            if (
                SiteFlag.objects.value(SiteFlagNameChoices.LAUNCHING_DISABLED)
                and self.instance.status == NimbusExperiment.Status.DRAFT
                and data.get("status_next") == NimbusExperiment.Status.LIVE
            ):
                raise serializers.ValidationError(
                    {"status_next": NimbusExperiment.ERROR_LAUNCHING_DISABLED}
                )

        return data