in experimenter/experimenter/experiments/api/v5/serializers.py [0:0]
def validate(self, data):
data = super().validate(data)
non_is_archived_fields = set(data.keys()) - set(
NimbusExperiment.ARCHIVE_UPDATE_EXEMPT_FIELDS
)
if self.instance and self.instance.is_archived and non_is_archived_fields:
raise serializers.ValidationError(
{
field: f"{field} can't be updated while an experiment is archived"
for field in non_is_archived_fields
}
)
primary_outcomes = set(data.get("primary_outcomes", []))
secondary_outcomes = set(data.get("secondary_outcomes", []))
if primary_outcomes.intersection(secondary_outcomes):
raise serializers.ValidationError(
{
"primary_outcomes": (
"Primary outcomes cannot overlap with secondary outcomes."
)
}
)
if self.instance and "targeting_config_slug" in data:
targeting_config_slug = data["targeting_config_slug"]
application_choice = NimbusExperiment.Application(self.instance.application)
targeting_config = NimbusExperiment.TARGETING_CONFIGS[targeting_config_slug]
if application_choice.name not in targeting_config.application_choice_names:
raise serializers.ValidationError(
{
"targeting_config_slug": (
f"Targeting config '{targeting_config.name}' is not "
f"available for application '{application_choice.label}'"
)
}
)
proposed_enrollment = data.get("proposed_enrollment")
proposed_duration = data.get("proposed_duration")
if (
None not in (proposed_enrollment, proposed_duration)
and proposed_enrollment > proposed_duration
):
raise serializers.ValidationError(
{
"proposed_enrollment": (
"The enrollment duration must be less than or "
"equal to the experiment duration."
)
}
)
if self.should_call_preview_task and not self.instance.can_publish_to_preview:
raise serializers.ValidationError(
{"status": [NimbusConstants.ERROR_CANNOT_PUBLISH_TO_PREVIEW]},
)
return data