147 lines
4.1 KiB
Python
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)
|