Files
empire/weirdlittleempire/management/translation.py
2021-02-23 23:00:01 +00:00

74 lines
2.5 KiB
Python

"""
These serializer mixinins and fields are used exclusively to import the file
``workdir/fixtures/products-meta.json``. They are not intended for general
purpose and can be deleted thereafter.
"""
from rest_framework import serializers
class TranslatableModelSerializerMixin:
"""
Pseudo class mimicking the behaviour of :class:`parler_rest.TranslatableModelSerializerMixin`.
It converts the content for fields of type TranslatedFieldsField to simple serializer
fields.
"""
def to_internal_value(self, data):
data = self._unify_translated_data(data)
result = super().to_internal_value(data)
return result
def _unify_translated_data(self, data):
"""
Unify translated data to be used by simple serializer fields.
"""
for field_name, field in self.get_fields().items():
if isinstance(field, TranslatedFieldsField):
key = field.source or field_name
translations = data.pop(key, None)
if isinstance(translations, dict):
data.update(translations.get('en', {}))
return data
class TranslatedFieldsField(serializers.Field):
"""
Pseudo class mimicking the behaviour of :class:`parler_rest.TranslatedFieldsField`, where only
the English translation is used.
"""
def to_representation(self, value):
raise NotImplementedError(
"If USE_I18N is False, do not use {cls}.to_representation() for field '{field_name}'. "
"It thwarts the possibility to reuse that string in a multi language environment.".format(
cls=self.__class__.__name__,
field_name=self.field_name,
)
)
def validate_empty_values(self, data):
raise serializers.SkipField()
class TranslatedField(serializers.Field):
"""
Pseudo class mimicking the behaviour of :class:`parler_rest.TranslatedField`, where only
the English translation is used.
"""
def to_representation(self, value):
raise NotImplementedError(
"If USE_I18N is False, do not use {cls}.to_representation() for field '{field_name}'. "
"It thwarts the possibility to reuse that string in a multi language environment.".format(
cls=self.__class__.__name__,
field_name=self.field_name,
)
)
def to_internal_value(self, data):
return data.get('en')
__all__ = ['TranslatedFieldsField', 'TranslatedField',
'TranslatableModelSerializerMixin']