version 0.0.20: fixed translate annotator

This commit is contained in:
Anatoly 2019-08-19 13:01:59 +03:00
parent bb91e65dee
commit 5564de5670
6 changed files with 57 additions and 37 deletions

View File

@ -1,9 +1,8 @@
from django.contrib.postgres.fields import JSONField
from django.contrib.postgres.fields.jsonb import KeyTextTransform
from django.db import models
from django.utils.translation import gettext_lazy as _
from utils.models import ProjectBaseMixin, BaseAttributes
from utils.models import ProjectBaseMixin, BaseAttributes, LocaleManagerMixin
class NewsType(models.Model):
@ -18,29 +17,9 @@ class NewsType(models.Model):
return self.name
class NewsManager(models.Manager):
class NewsManager(LocaleManagerMixin):
"""Manager for model News"""
def annotate_localized_fields(self, locale):
"""Return queryset by locale"""
prefix = 'trans'
# Prepare fields to localization (only JSONField can be localized)
fields = [field.name for field in self.model._meta.fields if isinstance(field, JSONField)]
# Check filters to check if field has localization
filters = {f'{field}__has_key': locale for field in fields}
# Filter QuerySet by prepared filters
queryset = self.filter(**filters)
# Prepare field for annotator
localized_fields = {f'{field}_{prefix}': KeyTextTransform(f'{locale}', field) for field in fields}
# Annotate them
for _ in fields:
queryset = queryset.annotate(**localized_fields)
return queryset
class NewsQuerySet(models.QuerySet):
"""QuerySet for model News"""

View File

@ -1,7 +1,8 @@
from rest_framework import serializers
from news import models
from location.serializers import AddressSerializer
from location.models import Address
from location.serializers import AddressSerializer
from news import models
class NewsTypeSerializer(serializers.ModelSerializer):
@ -14,15 +15,18 @@ class NewsTypeSerializer(serializers.ModelSerializer):
]
class NewsSerializer(serializers.ModelSerializer):
class NewsLocalizationMixinSerializer(serializers.ModelSerializer):
"""Serializer for localized fields"""
# Localized fields
title_trans = serializers.CharField(read_only=True)
subtitle_trans = serializers.CharField(read_only=True)
description_trans = serializers.CharField(read_only=True)
class NewsSerializer(NewsLocalizationMixinSerializer):
"""News serializer."""
address = AddressSerializer()
# Localized fields
title_trans = serializers.CharField()
subtitle_trans = serializers.CharField()
description_trans = serializers.CharField()
class Meta:
model = models.News
fields = [
@ -32,6 +36,7 @@ class NewsSerializer(serializers.ModelSerializer):
'end',
'playlist',
'address',
# Localized fields
'title_trans',
'subtitle_trans',
'description_trans',

View File

@ -28,9 +28,8 @@ class NewsCreate(generics.CreateAPIView):
serializer_class = serializers.NewsCreateUpdateSerializer
class NewsDetail(generics.RetrieveAPIView):
class NewsDetail(NewsViewMixin, generics.RetrieveAPIView):
"""News detail view."""
queryset = News.objects.all()
permission_classes = (permissions.AllowAny, )
serializer_class = serializers.NewsSerializer
@ -41,9 +40,8 @@ class NewsDelete(generics.DestroyAPIView):
permission_classes = (permissions.IsAuthenticated, )
class NewsUpdate(generics.UpdateAPIView):
class NewsUpdate(NewsViewMixin, generics.UpdateAPIView):
"""News update view."""
queryset = News.objects.all()
permission_classes = (permissions.IsAuthenticated, )
serializer_class = serializers.NewsCreateUpdateSerializer

View File

@ -8,6 +8,9 @@ from django.utils import timezone
from django.utils.html import mark_safe
from django.utils.translation import ugettext_lazy as _
from easy_thumbnails.fields import ThumbnailerImageField
from django.contrib.postgres.fields import JSONField
from django.contrib.postgres.fields.jsonb import KeyTextTransform
from django.contrib.auth.tokens import PasswordResetTokenGenerator
class ProjectBaseMixin(models.Model):
@ -113,3 +116,38 @@ class PlatformMixin(models.Model):
class Meta:
"""Meta class"""
abstract = True
class LocaleManagerMixin(models.Manager):
"""Manager for locale"""
def annotate_localized_fields(self, locale):
"""Return queryset by locale"""
prefix = 'trans'
# Prepare fields to localization (only JSONField can be localized)
fields = [field.name for field in self.model._meta.fields if isinstance(field, JSONField)]
# Check filters to check if field has localization
filters = {f'{field}__has_key': locale for field in fields}
# Filter QuerySet by prepared filters
queryset = self.filter(**filters)
# Prepare field for annotator
localized_fields = {f'{field}_{prefix}': KeyTextTransform(f'{locale}', field) for field in fields}
# Annotate them
for _ in fields:
queryset = queryset.annotate(**localized_fields)
return queryset
class SignupConfirmationTokenGenerator(PasswordResetTokenGenerator):
def _make_hash_value(self, user, timestamp):
return (
str(user.pk) + str(timestamp) + str(user.is_active)
)
confirm_signup_token = SignupConfirmationTokenGenerator()

View File

@ -6,7 +6,7 @@ ALLOWED_HOSTS = ['*', ]
SEND_SMS = False
SMS_CODE_SHOW = True
DOMAIN_URI = 'localhost:8000'
DOMAIN_URI = '0.0.0.0:8000'
# Increase access token lifetime for local deploy
SIMPLE_JWT['ACCESS_TOKEN_LIFETIME'] = timedelta(days=365)

View File

@ -27,4 +27,4 @@ django-extensions==2.2.1
django-cors-headers==3.0.2
# JWT
djangorestframework_simplejwt==4.3.0
djangorestframework-simplejwt==4.3.0