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 main.models import Currency
|
||||
from utils.serializers import TJSONSerializer
|
||||
|
||||
|
||||
class EstablishmentListCreateSerializer(EstablishmentBaseSerializer):
|
||||
|
|
@ -89,7 +90,7 @@ class SocialNetworkSerializers(serializers.ModelSerializer):
|
|||
|
||||
class PlatesSerializers(PlateSerializer):
|
||||
"""Social network serializers."""
|
||||
name = serializers.JSONField()
|
||||
name = TJSONSerializer
|
||||
currency_id = serializers.PrimaryKeyRelatedField(
|
||||
source='currency',
|
||||
queryset=Currency.objects.all(), write_only=True
|
||||
|
|
|
|||
|
|
@ -12,7 +12,7 @@ from review import models as review_models
|
|||
from timetable.serialziers import ScheduleRUDSerializer
|
||||
from utils import exceptions as utils_exceptions
|
||||
from django.utils.translation import gettext_lazy as _
|
||||
|
||||
from utils.serializers import TJSONSerializer
|
||||
|
||||
class ContactPhonesSerializer(serializers.ModelSerializer):
|
||||
"""Contact phone serializer"""
|
||||
|
|
@ -60,7 +60,7 @@ class PlateSerializer(serializers.ModelSerializer):
|
|||
|
||||
class MenuSerializers(serializers.ModelSerializer):
|
||||
plates = PlateSerializer(read_only=True, many=True, source='plate_set')
|
||||
category = serializers.JSONField()
|
||||
category = TJSONSerializer()
|
||||
category_translated = serializers.CharField(read_only=True)
|
||||
|
||||
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')
|
||||
category = serializers.JSONField()
|
||||
category = TJSONSerializer()
|
||||
|
||||
class Meta:
|
||||
model = models.Menu
|
||||
|
|
|
|||
|
|
@ -5,7 +5,6 @@ from rest_framework import status
|
|||
from http.cookies import SimpleCookie
|
||||
from main.models import Currency
|
||||
from establishment.models import Establishment, EstablishmentType, Menu
|
||||
|
||||
# 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 utils.methods import image_path, svg_image_path
|
||||
from utils.validators import svg_image_validator
|
||||
from django.db.models.fields import Field
|
||||
from django.core import exceptions
|
||||
|
||||
|
||||
class ProjectBaseMixin(models.Model):
|
||||
|
|
@ -26,6 +28,10 @@ class ProjectBaseMixin(models.Model):
|
|||
abstract = True
|
||||
|
||||
|
||||
def valid(value):
|
||||
print("Run")
|
||||
|
||||
|
||||
class TJSONField(JSONField):
|
||||
"""Overrided JsonField."""
|
||||
|
||||
|
|
@ -52,6 +58,7 @@ def translate_field(self, field_name):
|
|||
if isinstance(field, dict):
|
||||
return field.get(to_locale(get_language()))
|
||||
return None
|
||||
|
||||
return translate
|
||||
|
||||
|
||||
|
|
@ -70,6 +77,7 @@ def index_field(self, field_name):
|
|||
for key, value in field.items():
|
||||
setattr(obj, key, value)
|
||||
return obj
|
||||
|
||||
return index
|
||||
|
||||
|
||||
|
|
@ -236,7 +244,8 @@ class LocaleManagerMixin(models.Manager):
|
|||
queryset = self.filter(**filters)
|
||||
|
||||
# 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
|
||||
for _ in fields:
|
||||
|
|
@ -245,7 +254,6 @@ class LocaleManagerMixin(models.Manager):
|
|||
|
||||
|
||||
class GMTokenGenerator(PasswordResetTokenGenerator):
|
||||
|
||||
CHANGE_EMAIL = 0
|
||||
RESET_PASSWORD = 1
|
||||
CHANGE_PASSWORD = 2
|
||||
|
|
@ -268,10 +276,10 @@ class GMTokenGenerator(PasswordResetTokenGenerator):
|
|||
"""
|
||||
fields = [str(timestamp), str(user.is_active), str(user.pk)]
|
||||
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)])
|
||||
elif self.purpose == self.RESET_PASSWORD or \
|
||||
self.purpose == self.CHANGE_PASSWORD:
|
||||
self.purpose == self.CHANGE_PASSWORD:
|
||||
fields.append(str(user.password))
|
||||
return fields
|
||||
|
||||
|
|
|
|||
|
|
@ -1,6 +1,8 @@
|
|||
"""Utils app serializer."""
|
||||
from rest_framework import serializers
|
||||
from utils.models import PlatformMixin
|
||||
from django.core import exceptions
|
||||
from translation.models import Language
|
||||
|
||||
|
||||
class EmptySerializer(serializers.Serializer):
|
||||
|
|
@ -21,3 +23,26 @@ class TranslatedField(serializers.CharField):
|
|||
**kwargs):
|
||||
super().__init__(allow_null=allow_null, required=required,
|
||||
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 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
|
||||
|
||||
|
||||
|
|
@ -118,3 +123,36 @@ class BaseAttributeTests(BaseTestCase):
|
|||
employee.refresh_from_db()
|
||||
self.assertEqual(modify_user, employee.modified_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