"""Utils app serializer.""" import pytz 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}, ) is_lang = Language.objects.filter(locale__in=value.keys()).exists() if not is_lang: 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 TimeZoneChoiceField(serializers.ChoiceField): """Take the timezone object and make it JSON serializable.""" def __init__(self, choices=None, **kwargs): if choices is None: choices = pytz.all_timezones super().__init__(choices=choices, **kwargs) def to_representation(self, value): return value.zone def to_internal_value(self, data): return pytz.timezone(data) class ProjectModelSerializer(serializers.ModelSerializer): """Overrided ModelSerializer.""" serializers.ModelSerializer.serializer_field_mapping[models.TJSONField] = TJSONField