gault-millau/apps/utils/serializers.py
2020-02-07 14:09:53 +03:00

147 lines
4.1 KiB
Python

"""Utils app serializer."""
import pytz
from django.core import exceptions
from rest_framework import serializers
from favorites.models import Favorites
from main.models import Carousel
from translation.models import Language
from utils import models
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):
if isinstance(value, str):
return value
elif isinstance(value, pytz.tzinfo.BaseTzInfo):
return value.zone
return None
def to_internal_value(self, data):
return pytz.timezone(data)
class ProjectModelSerializer(serializers.ModelSerializer):
"""Overridden ModelSerializer."""
serializers.ModelSerializer.serializer_field_mapping[models.TJSONField] = TJSONField
class FavoritesCreateSerializer(serializers.ModelSerializer):
"""Serializer to favorite object."""
class Meta:
model = Favorites
fields = [
'id',
'created',
]
@property
def request(self):
return self.context.get('request')
@property
def user(self):
"""Get user from request"""
return self.request.user
@property
def slug(self):
return self.request.parser_context.get('kwargs').get('slug')
class CarouselCreateSerializer(serializers.ModelSerializer):
"""Carousel to favorite object."""
class Meta:
model = Carousel
fields = [
'id',
'active',
]
@property
def request(self):
return self.context.get('request')
@property
def pk(self):
return self.request.parser_context.get('kwargs').get('pk')
@property
def slug(self):
return self.request.parser_context.get('kwargs').get('slug')
class RecursiveFieldSerializer(serializers.Serializer):
def to_representation(self, value):
serializer = self.parent.parent.__class__(value, context=self.context)
return serializer.data
class ImageBaseSerializer(serializers.Serializer):
"""Serializer for returning crop images of model image."""
id = serializers.IntegerField()
title = serializers.CharField()
original_url = serializers.URLField()
orientation_display = serializers.CharField()
auto_crop_images = serializers.DictField(allow_null=True)
class PhoneMixinSerializer(serializers.Serializer):
"""Phone mixin serializer."""
country_calling_code = serializers.CharField(read_only=True, allow_null=True)
national_calling_number = serializers.CharField(read_only=True, allow_null=True)