Merge branch 'feature/json_serializator' into 'develop'
Feature/json serializator See merge request gm/gm-backend!30
This commit is contained in:
commit
0234a74e06
|
|
@ -11,6 +11,7 @@ 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,7 +90,7 @@ class SocialNetworkSerializers(serializers.ModelSerializer):
|
||||||
|
|
||||||
class PlatesSerializers(PlateSerializer):
|
class PlatesSerializers(PlateSerializer):
|
||||||
"""Social network serializers."""
|
"""Social network serializers."""
|
||||||
name = serializers.JSONField()
|
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
|
||||||
|
|
|
||||||
|
|
@ -12,7 +12,7 @@ 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 django.utils.translation import gettext_lazy as _
|
from django.utils.translation import gettext_lazy as _
|
||||||
|
from utils.serializers import TJSONSerializer
|
||||||
|
|
||||||
class ContactPhonesSerializer(serializers.ModelSerializer):
|
class ContactPhonesSerializer(serializers.ModelSerializer):
|
||||||
"""Contact phone serializer"""
|
"""Contact phone serializer"""
|
||||||
|
|
@ -60,7 +60,7 @@ class PlateSerializer(serializers.ModelSerializer):
|
||||||
|
|
||||||
class MenuSerializers(serializers.ModelSerializer):
|
class MenuSerializers(serializers.ModelSerializer):
|
||||||
plates = PlateSerializer(read_only=True, many=True, source='plate_set')
|
plates = PlateSerializer(read_only=True, many=True, source='plate_set')
|
||||||
category = serializers.JSONField()
|
category = TJSONSerializer()
|
||||||
category_translated = serializers.CharField(read_only=True)
|
category_translated = serializers.CharField(read_only=True)
|
||||||
|
|
||||||
class Meta:
|
class Meta:
|
||||||
|
|
@ -74,9 +74,9 @@ class MenuSerializers(serializers.ModelSerializer):
|
||||||
]
|
]
|
||||||
|
|
||||||
|
|
||||||
class MenuRUDSerializers(serializers.ModelSerializer):
|
class MenuRUDSerializers(serializers.ModelSerializer, ):
|
||||||
plates = PlateSerializer(read_only=True, many=True, source='plate_set')
|
plates = PlateSerializer(read_only=True, many=True, source='plate_set')
|
||||||
category = serializers.JSONField()
|
category = TJSONSerializer()
|
||||||
|
|
||||||
class Meta:
|
class Meta:
|
||||||
model = models.Menu
|
model = models.Menu
|
||||||
|
|
|
||||||
|
|
@ -5,7 +5,6 @@ from rest_framework import status
|
||||||
from http.cookies import SimpleCookie
|
from http.cookies import SimpleCookie
|
||||||
from main.models import Currency
|
from main.models import Currency
|
||||||
from establishment.models import Establishment, EstablishmentType, Menu
|
from establishment.models import Establishment, EstablishmentType, Menu
|
||||||
|
|
||||||
# Create your tests here.
|
# Create your tests here.
|
||||||
|
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -10,6 +10,8 @@ from django.utils.translation import ugettext_lazy as _, get_language
|
||||||
from easy_thumbnails.fields import ThumbnailerImageField
|
from easy_thumbnails.fields import ThumbnailerImageField
|
||||||
from utils.methods import image_path, svg_image_path
|
from utils.methods import image_path, svg_image_path
|
||||||
from utils.validators import svg_image_validator
|
from utils.validators import svg_image_validator
|
||||||
|
from django.db.models.fields import Field
|
||||||
|
from django.core import exceptions
|
||||||
|
|
||||||
|
|
||||||
class ProjectBaseMixin(models.Model):
|
class ProjectBaseMixin(models.Model):
|
||||||
|
|
@ -26,6 +28,10 @@ class ProjectBaseMixin(models.Model):
|
||||||
abstract = True
|
abstract = True
|
||||||
|
|
||||||
|
|
||||||
|
def valid(value):
|
||||||
|
print("Run")
|
||||||
|
|
||||||
|
|
||||||
class TJSONField(JSONField):
|
class TJSONField(JSONField):
|
||||||
"""Overrided JsonField."""
|
"""Overrided JsonField."""
|
||||||
|
|
||||||
|
|
@ -52,6 +58,7 @@ def translate_field(self, field_name):
|
||||||
if isinstance(field, dict):
|
if isinstance(field, dict):
|
||||||
return field.get(to_locale(get_language()))
|
return field.get(to_locale(get_language()))
|
||||||
return None
|
return None
|
||||||
|
|
||||||
return translate
|
return translate
|
||||||
|
|
||||||
|
|
||||||
|
|
@ -70,6 +77,7 @@ def index_field(self, field_name):
|
||||||
for key, value in field.items():
|
for key, value in field.items():
|
||||||
setattr(obj, key, value)
|
setattr(obj, key, value)
|
||||||
return obj
|
return obj
|
||||||
|
|
||||||
return index
|
return index
|
||||||
|
|
||||||
|
|
||||||
|
|
@ -236,7 +244,8 @@ class LocaleManagerMixin(models.Manager):
|
||||||
queryset = self.filter(**filters)
|
queryset = self.filter(**filters)
|
||||||
|
|
||||||
# Prepare field for annotator
|
# Prepare field for annotator
|
||||||
localized_fields = {f'{field}_{prefix}': KeyTextTransform(f'{locale}', field) for field in fields}
|
localized_fields = {f'{field}_{prefix}': KeyTextTransform(f'{locale}', field) for field in
|
||||||
|
fields}
|
||||||
|
|
||||||
# Annotate them
|
# Annotate them
|
||||||
for _ in fields:
|
for _ in fields:
|
||||||
|
|
@ -245,7 +254,6 @@ class LocaleManagerMixin(models.Manager):
|
||||||
|
|
||||||
|
|
||||||
class GMTokenGenerator(PasswordResetTokenGenerator):
|
class GMTokenGenerator(PasswordResetTokenGenerator):
|
||||||
|
|
||||||
CHANGE_EMAIL = 0
|
CHANGE_EMAIL = 0
|
||||||
RESET_PASSWORD = 1
|
RESET_PASSWORD = 1
|
||||||
CHANGE_PASSWORD = 2
|
CHANGE_PASSWORD = 2
|
||||||
|
|
@ -268,10 +276,10 @@ class GMTokenGenerator(PasswordResetTokenGenerator):
|
||||||
"""
|
"""
|
||||||
fields = [str(timestamp), str(user.is_active), str(user.pk)]
|
fields = [str(timestamp), str(user.is_active), str(user.pk)]
|
||||||
if self.purpose == self.CHANGE_EMAIL or \
|
if self.purpose == self.CHANGE_EMAIL or \
|
||||||
self.purpose == self.CONFIRM_EMAIL:
|
self.purpose == self.CONFIRM_EMAIL:
|
||||||
fields.extend([str(user.email_confirmed), str(user.email)])
|
fields.extend([str(user.email_confirmed), str(user.email)])
|
||||||
elif self.purpose == self.RESET_PASSWORD or \
|
elif self.purpose == self.RESET_PASSWORD or \
|
||||||
self.purpose == self.CHANGE_PASSWORD:
|
self.purpose == self.CHANGE_PASSWORD:
|
||||||
fields.append(str(user.password))
|
fields.append(str(user.password))
|
||||||
return fields
|
return fields
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -1,6 +1,8 @@
|
||||||
"""Utils app serializer."""
|
"""Utils app serializer."""
|
||||||
from rest_framework import serializers
|
from rest_framework import serializers
|
||||||
from utils.models import PlatformMixin
|
from utils.models import PlatformMixin
|
||||||
|
from django.core import exceptions
|
||||||
|
from translation.models import Language
|
||||||
|
|
||||||
|
|
||||||
class EmptySerializer(serializers.Serializer):
|
class EmptySerializer(serializers.Serializer):
|
||||||
|
|
@ -21,3 +23,26 @@ class TranslatedField(serializers.CharField):
|
||||||
**kwargs):
|
**kwargs):
|
||||||
super().__init__(allow_null=allow_null, required=required,
|
super().__init__(allow_null=allow_null, required=required,
|
||||||
read_only=read_only, **kwargs)
|
read_only=read_only, **kwargs)
|
||||||
|
|
||||||
|
|
||||||
|
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 == 0:
|
||||||
|
raise exceptions.ValidationError(
|
||||||
|
'invalid_translated_keys',
|
||||||
|
code='invalid_translated_keys',
|
||||||
|
params={'value': value},
|
||||||
|
)
|
||||||
|
|
||||||
|
|
||||||
|
class TJSONSerializer(serializers.JSONField):
|
||||||
|
validators = [validate_tjson]
|
||||||
|
|
|
||||||
|
|
@ -8,6 +8,11 @@ from http.cookies import SimpleCookie
|
||||||
from account.models import User
|
from account.models import User
|
||||||
from news.models import News, NewsType
|
from news.models import News, NewsType
|
||||||
|
|
||||||
|
from django.test import TestCase
|
||||||
|
from translation.models import Language
|
||||||
|
from django.core import exceptions
|
||||||
|
from .serializers import validate_tjson
|
||||||
|
|
||||||
from establishment.models import Establishment, EstablishmentType, Employee
|
from establishment.models import Establishment, EstablishmentType, Employee
|
||||||
|
|
||||||
|
|
||||||
|
|
@ -118,3 +123,36 @@ class BaseAttributeTests(BaseTestCase):
|
||||||
employee.refresh_from_db()
|
employee.refresh_from_db()
|
||||||
self.assertEqual(modify_user, employee.modified_by)
|
self.assertEqual(modify_user, employee.modified_by)
|
||||||
self.assertEqual(self.user, employee.created_by)
|
self.assertEqual(self.user, employee.created_by)
|
||||||
|
|
||||||
|
|
||||||
|
class ValidJSONTest(TestCase):
|
||||||
|
|
||||||
|
def test_valid_json(self):
|
||||||
|
lang = Language.objects.create(title='English', locale='en-GB')
|
||||||
|
lang.save()
|
||||||
|
|
||||||
|
data = 'str'
|
||||||
|
|
||||||
|
with self.assertRaises(exceptions.ValidationError) as err:
|
||||||
|
validate_tjson(data)
|
||||||
|
|
||||||
|
self.assertEqual(err.exception.code, 'invalid_json')
|
||||||
|
|
||||||
|
data = {
|
||||||
|
"string": "value"
|
||||||
|
}
|
||||||
|
|
||||||
|
with self.assertRaises(exceptions.ValidationError) as err:
|
||||||
|
validate_tjson(data)
|
||||||
|
|
||||||
|
self.assertEqual(err.exception.code, 'invalid_translated_keys')
|
||||||
|
|
||||||
|
data = {
|
||||||
|
"en-GB": "English"
|
||||||
|
}
|
||||||
|
|
||||||
|
try:
|
||||||
|
validate_tjson(data)
|
||||||
|
self.assertTrue(True)
|
||||||
|
except exceptions.ValidationError:
|
||||||
|
self.assert_(False, "Test json translated FAILED")
|
||||||
Loading…
Reference in New Issue
Block a user