in experimenter/experimenter/experiments/api/v5/serializers.py [0:0]
def _validate_localizations(self, data):
is_localized = data.get("is_localized")
if not is_localized:
return data
application = data.get("application")
if application != NimbusExperiment.Application.DESKTOP:
raise serializers.ValidationError(
{
"application": [
"Localized experiments are only supported for Firefox Desktop."
]
}
)
min_version = data.get("firefox_min_version", "")
supported_version = NimbusExperiment.Version.parse(
NimbusConstants.LOCALIZATION_SUPPORTED_VERSION[application]
)
if min_version == "" or (
NimbusExperiment.Version.parse(min_version) < supported_version
):
raise serializers.ValidationError(
{
"firefox_min_version": [
NimbusConstants.ERROR_DESKTOP_LOCALIZATION_VERSION,
],
}
)
experiment_locales = data.get("locales")
if not experiment_locales:
raise serializers.ValidationError(
{"locales": ["Locales must not be empty for a localized experiment."]}
)
localizations_json = data.get("localizations")
try:
localizations = json.loads(localizations_json)
except json.decoder.JSONDecodeError as e:
raise serializers.ValidationError(
{"localizations": [f"Invalid JSON: {e}"]}
) from e
try:
ExperimentLocalizations.model_validate(localizations)
except Exception as e:
raise serializers.ValidationError(
{"localizations": [f"Localization schema validation error: {e}"]}
) from e
experiment_locale_codes = [locale.code for locale in experiment_locales]
for locale_code in experiment_locale_codes:
if locale_code not in localizations:
raise serializers.ValidationError(
{
"localizations": [
f"Experiment locale {locale_code} not present in "
f"localizations."
]
}
)
for localization in localizations:
if localization not in experiment_locale_codes:
raise serializers.ValidationError(
{
"localizations": [
f"Localization locale {localization} does not exist in "
f"experiment locales."
]
}
)
return data