in src/olympia/addons/validators.py [0:0]
def __call__(self, data, serializer):
from olympia.api.fields import TranslationSerializerField
new_default = data.get('default_locale')
if serializer.instance and not new_default:
# We can skip updates to existing add-ons with no default_locale changes.
return
if not serializer.instance:
parsed_data = serializer.fields['version'].parsed_data
# Addon.resolve_webext_translations does find_language to check if l10n
if lang := find_language(parsed_data.get('default_locale')):
xpi_trans = Addon.resolve_webext_translations(
parsed_data,
data['version']['upload'],
use_default_locale_fallback=False,
)
new_default = new_default or lang
else:
xpi_trans = None
new_default = new_default or settings.LANGUAGE_CODE
fields = [
(name, field)
for name, field in serializer.fields.items()
if isinstance(field, TranslationSerializerField)
]
errors = {}
# confirm all the translated fields have a value in this new locale
for field_name, field in fields:
if serializer.instance:
# for an existing addon we need to consider all the existing values
existing = field.fetch_all_translations(
serializer.instance, field.get_source_field(serializer.instance)
)
all_translations = {
loc: val
for loc, val in {**existing, **data.get(field_name, {})}.items()
if val is not None
}
elif field_name in data:
# for a new addon a value in data overrides the xpi value/translations
all_translations = {
loc: val
for loc, val in data.get(field_name, {}).items()
if val is not None
}
elif xpi_trans:
# else we need to check the xpi localization - if there is xpi l10n
all_translations = xpi_trans.get(field_name)
else:
all_translations = None
if all_translations and new_default not in all_translations:
errors[field_name] = TranslationSerializerField.default_error_messages[
'default_locale_required'
].format(lang_code=new_default)
if errors:
raise exceptions.ValidationError(errors)