diff --git a/apps/establishment/serializers/back.py b/apps/establishment/serializers/back.py index ab28fffd..96795711 100644 --- a/apps/establishment/serializers/back.py +++ b/apps/establishment/serializers/back.py @@ -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 diff --git a/apps/establishment/serializers/common.py b/apps/establishment/serializers/common.py index 691f3b43..f59f5d7b 100644 --- a/apps/establishment/serializers/common.py +++ b/apps/establishment/serializers/common.py @@ -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 diff --git a/apps/establishment/tests.py b/apps/establishment/tests.py index 90a8f80c..16d224b8 100644 --- a/apps/establishment/tests.py +++ b/apps/establishment/tests.py @@ -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. diff --git a/apps/utils/models.py b/apps/utils/models.py index 632cf4a2..4e6df35e 100644 --- a/apps/utils/models.py +++ b/apps/utils/models.py @@ -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 diff --git a/apps/utils/serializers.py b/apps/utils/serializers.py index 1f4c6f96..d30a046c 100644 --- a/apps/utils/serializers.py +++ b/apps/utils/serializers.py @@ -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] diff --git a/apps/utils/tests.py b/apps/utils/tests.py index e9ad3c23..0ca77b6b 100644 --- a/apps/utils/tests.py +++ b/apps/utils/tests.py @@ -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") \ No newline at end of file