gault-millau/apps/utils/serializers.py
2019-10-01 13:03:59 +03:00

55 lines
1.7 KiB
Python

"""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