Refactor JSON Validation
This commit is contained in:
parent
1798978cf7
commit
051957c7cf
|
|
@ -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',
|
||||||
|
|
|
||||||
|
|
@ -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"""
|
||||||
|
|
|
||||||
|
|
@ -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)
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -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()
|
||||||
|
|
|
||||||
|
|
@ -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
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue
Block a user