"""Utils app serializer.""" from django.core import exceptions from rest_framework import serializers from utils import models from translation.models import Language class EmptySerializer(serializers.Serializer): """Empty Serializer""" class SourceSerializerMixin(serializers.Serializer): """Base authorization serializer mixin""" source = serializers.ChoiceField(choices=models.PlatformMixin.SOURCES, default=models.PlatformMixin.WEB, write_only=True) class TranslatedField(serializers.CharField): """Translated field.""" def __init__(self, allow_null=True, required=False, read_only=True, **kwargs): super().__init__(allow_null=allow_null, required=required, read_only=read_only, **kwargs) # todo: view validation in more detail def validate_tjson(value): if not isinstance(value, dict): raise exceptions.ValidationError( 'invalid_json', code='invalid_json', params={'value': value}, ) lang_count = Language.objects.filter(locale__in=value.keys()).count() if lang_count != len(value.keys()): raise exceptions.ValidationError( 'invalid_translated_keys', code='invalid_translated_keys', params={'value': value}, ) class TJSONField(serializers.JSONField): """Custom serializer's JSONField for model's TJSONField.""" validators = [validate_tjson] class ProjectModelSerializer(serializers.ModelSerializer): """Overrided ModelSerializer.""" serializers.ModelSerializer.serializer_field_mapping[models.TJSONField] = TJSONField