Refactor JSON Validation

This commit is contained in:
evgeniy-st 2019-10-01 13:03:59 +03:00
parent 1798978cf7
commit 051957c7cf
5 changed files with 34 additions and 35 deletions

View File

@ -8,7 +8,6 @@ from establishment.serializers import (
from utils.decorators import with_base_attributes from utils.decorators import with_base_attributes
from main.models import Currency from main.models import Currency
from utils.serializers import TJSONSerializer
class EstablishmentListCreateSerializer(EstablishmentBaseSerializer): class EstablishmentListCreateSerializer(EstablishmentBaseSerializer):
@ -89,13 +88,15 @@ class SocialNetworkSerializers(serializers.ModelSerializer):
class PlatesSerializers(PlateSerializer): class PlatesSerializers(PlateSerializer):
"""Social network serializers.""" """Social network serializers."""
name = TJSONSerializer
currency_id = serializers.PrimaryKeyRelatedField( currency_id = serializers.PrimaryKeyRelatedField(
source='currency', source='currency',
queryset=Currency.objects.all(), write_only=True queryset=Currency.objects.all(), write_only=True
) )
class Meta: class Meta:
"""Meta class."""
model = models.Plate model = models.Plate
fields = PlateSerializer.Meta.fields + [ fields = PlateSerializer.Meta.fields + [
'name', 'name',

View File

@ -1,6 +1,6 @@
"""Establishment serializers.""" """Establishment serializers."""
from rest_framework import serializers
from django.utils.translation import ugettext_lazy as _ from django.utils.translation import ugettext_lazy as _
from rest_framework import serializers
from comment import models as comment_models from comment import models as comment_models
from comment.serializers import common as comment_serializers from comment.serializers import common as comment_serializers
from establishment import models from establishment import models
@ -11,8 +11,7 @@ from main.serializers import MetaDataContentSerializer, AwardSerializer, Currenc
from review import models as review_models from review import models as review_models
from timetable.serialziers import ScheduleRUDSerializer from timetable.serialziers import ScheduleRUDSerializer
from utils import exceptions as utils_exceptions from utils import exceptions as utils_exceptions
from utils.serializers import TranslatedField from utils.serializers import TranslatedField, ProjectModelSerializer
from utils.serializers import TJSONSerializer
class ContactPhonesSerializer(serializers.ModelSerializer): class ContactPhonesSerializer(serializers.ModelSerializer):
@ -44,9 +43,9 @@ class SocialNetworkRelatedSerializers(serializers.ModelSerializer):
] ]
class PlateSerializer(serializers.ModelSerializer): class PlateSerializer(ProjectModelSerializer):
name_translated = serializers.CharField(allow_null=True, read_only=True) name_translated = TranslatedField()
currency = CurrencySerializer(read_only=True) currency = CurrencySerializer(read_only=True)
class Meta: class Meta:
@ -59,9 +58,8 @@ class PlateSerializer(serializers.ModelSerializer):
] ]
class MenuSerializers(serializers.ModelSerializer): class MenuSerializers(ProjectModelSerializer):
plates = PlateSerializer(read_only=True, many=True, source='plate_set') plates = PlateSerializer(read_only=True, many=True, source='plate_set')
category = TJSONSerializer()
category_translated = serializers.CharField(read_only=True) category_translated = serializers.CharField(read_only=True)
class Meta: class Meta:
@ -75,9 +73,8 @@ class MenuSerializers(serializers.ModelSerializer):
] ]
class MenuRUDSerializers(serializers.ModelSerializer, ): class MenuRUDSerializers(ProjectModelSerializer):
plates = PlateSerializer(read_only=True, many=True, source='plate_set') plates = PlateSerializer(read_only=True, many=True, source='plate_set')
category = TJSONSerializer()
class Meta: class Meta:
model = models.Menu model = models.Menu
@ -141,7 +138,7 @@ class EstablishmentEmployeeSerializer(serializers.ModelSerializer):
fields = ('id', 'name', 'position_translated', 'awards', 'priority') fields = ('id', 'name', 'position_translated', 'awards', 'priority')
class EstablishmentBaseSerializer(serializers.ModelSerializer): class EstablishmentBaseSerializer(ProjectModelSerializer):
"""Base serializer for Establishment model.""" """Base serializer for Establishment model."""
preview_image = serializers.URLField(source='preview_image_url') preview_image = serializers.URLField(source='preview_image_url')
@ -233,16 +230,6 @@ class EstablishmentDetailSerializer(EstablishmentListSerializer):
'vintage_year', 'vintage_year',
] ]
# def get_in_favorites(self, obj):
# """Get in_favorites status flag"""
# user = self.context.get('request').user
# if user.is_authenticated:
# return obj.id in user.favorites.by_content_type(app_label='establishment',
# model='establishment')\
# .values_list('object_id', flat=True)
# else:
# return False
class EstablishmentCommentCreateSerializer(comment_serializers.CommentSerializer): class EstablishmentCommentCreateSerializer(comment_serializers.CommentSerializer):
"""Create comment serializer""" """Create comment serializer"""

View File

@ -1,11 +1,12 @@
"""News app common serializers.""" """News app common serializers."""
from rest_framework import serializers from rest_framework import serializers
from account.serializers.common import UserSerializer
from location import models as location_models from location import models as location_models
from location.serializers import CountrySimpleSerializer from location.serializers import CountrySimpleSerializer
from main.serializers import MetaDataContentSerializer from main.serializers import MetaDataContentSerializer
from news import models from news import models
from utils.serializers import TranslatedField from utils.serializers import TranslatedField, ProjectModelSerializer
from account.serializers.common import UserSerializer
class NewsTypeSerializer(serializers.ModelSerializer): class NewsTypeSerializer(serializers.ModelSerializer):
"""News type serializer.""" """News type serializer."""
@ -17,7 +18,7 @@ class NewsTypeSerializer(serializers.ModelSerializer):
fields = ('id', 'name') fields = ('id', 'name')
class NewsBaseSerializer(serializers.ModelSerializer): class NewsBaseSerializer(ProjectModelSerializer):
"""Base serializer for News model.""" """Base serializer for News model."""
# read only fields # read only fields
@ -50,7 +51,8 @@ class NewsDetailSerializer(NewsBaseSerializer):
description_translated = TranslatedField() description_translated = TranslatedField()
country = CountrySimpleSerializer(read_only=True) country = CountrySimpleSerializer(read_only=True)
author = UserSerializer(source='created_by') # todo: check the data redundancy
author = UserSerializer(source='created_by', read_only=True)
state_display = serializers.CharField(source='get_state_display', state_display = serializers.CharField(source='get_state_display',
read_only=True) read_only=True)

View File

@ -20,11 +20,13 @@ class NewsMixinView:
class NewsListView(NewsMixinView, generics.ListAPIView): class NewsListView(NewsMixinView, generics.ListAPIView):
"""News list view.""" """News list view."""
filter_class = filters.NewsListFilterSet filter_class = filters.NewsListFilterSet
class NewsDetailView(NewsMixinView, generics.RetrieveAPIView): class NewsDetailView(NewsMixinView, generics.RetrieveAPIView):
"""News detail view.""" """News detail view."""
lookup_field = 'slug' lookup_field = 'slug'
serializer_class = serializers.NewsDetailSerializer serializer_class = serializers.NewsDetailSerializer
@ -54,6 +56,7 @@ class NewsBackOfficeLCView(NewsBackOfficeMixinView,
create_serializers_class = serializers.NewsBackOfficeDetailSerializer create_serializers_class = serializers.NewsBackOfficeDetailSerializer
def get_serializer_class(self): def get_serializer_class(self):
"""Override serializer class."""
if self.request.method == 'POST': if self.request.method == 'POST':
return self.create_serializers_class return self.create_serializers_class
return super().get_serializer_class() return super().get_serializer_class()

View File

@ -1,7 +1,7 @@
"""Utils app serializer.""" """Utils app serializer."""
from rest_framework import serializers
from utils.models import PlatformMixin
from django.core import exceptions from django.core import exceptions
from rest_framework import serializers
from utils import models
from translation.models import Language from translation.models import Language
@ -11,8 +11,8 @@ class EmptySerializer(serializers.Serializer):
class SourceSerializerMixin(serializers.Serializer): class SourceSerializerMixin(serializers.Serializer):
"""Base authorization serializer mixin""" """Base authorization serializer mixin"""
source = serializers.ChoiceField(choices=PlatformMixin.SOURCES, source = serializers.ChoiceField(choices=models.PlatformMixin.SOURCES,
default=PlatformMixin.WEB, default=models.PlatformMixin.WEB,
write_only=True) write_only=True)
@ -25,18 +25,16 @@ class TranslatedField(serializers.CharField):
read_only=read_only, **kwargs) read_only=read_only, **kwargs)
# todo: view validation in more detail
def validate_tjson(value): def validate_tjson(value):
if not isinstance(value, dict): if not isinstance(value, dict):
raise exceptions.ValidationError( raise exceptions.ValidationError(
'invalid_json', 'invalid_json',
code='invalid_json', code='invalid_json',
params={'value': value}, params={'value': value},
) )
lang_count = Language.objects.filter(locale__in=value.keys()).count() lang_count = Language.objects.filter(locale__in=value.keys()).count()
if lang_count != len(value.keys()):
if lang_count == 0:
raise exceptions.ValidationError( raise exceptions.ValidationError(
'invalid_translated_keys', 'invalid_translated_keys',
code='invalid_translated_keys', code='invalid_translated_keys',
@ -44,5 +42,13 @@ def validate_tjson(value):
) )
class TJSONSerializer(serializers.JSONField): class TJSONField(serializers.JSONField):
"""Custom serializer's JSONField for model's TJSONField."""
validators = [validate_tjson] validators = [validate_tjson]
class ProjectModelSerializer(serializers.ModelSerializer):
"""Overrided ModelSerializer."""
serializers.ModelSerializer.serializer_field_mapping[models.TJSONField] = TJSONField