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