version 0.0.20: fixed translate annotator
This commit is contained in:
parent
bb91e65dee
commit
5564de5670
|
|
@ -1,9 +1,8 @@
|
||||||
from django.contrib.postgres.fields import JSONField
|
from django.contrib.postgres.fields import JSONField
|
||||||
from django.contrib.postgres.fields.jsonb import KeyTextTransform
|
|
||||||
from django.db import models
|
from django.db import models
|
||||||
from django.utils.translation import gettext_lazy as _
|
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):
|
class NewsType(models.Model):
|
||||||
|
|
@ -18,29 +17,9 @@ class NewsType(models.Model):
|
||||||
return self.name
|
return self.name
|
||||||
|
|
||||||
|
|
||||||
class NewsManager(models.Manager):
|
class NewsManager(LocaleManagerMixin):
|
||||||
"""Manager for model News"""
|
"""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):
|
class NewsQuerySet(models.QuerySet):
|
||||||
"""QuerySet for model News"""
|
"""QuerySet for model News"""
|
||||||
|
|
|
||||||
|
|
@ -1,7 +1,8 @@
|
||||||
from rest_framework import serializers
|
from rest_framework import serializers
|
||||||
from news import models
|
|
||||||
from location.serializers import AddressSerializer
|
|
||||||
from location.models import Address
|
from location.models import Address
|
||||||
|
from location.serializers import AddressSerializer
|
||||||
|
from news import models
|
||||||
|
|
||||||
|
|
||||||
class NewsTypeSerializer(serializers.ModelSerializer):
|
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."""
|
"""News serializer."""
|
||||||
address = AddressSerializer()
|
address = AddressSerializer()
|
||||||
|
|
||||||
# Localized fields
|
|
||||||
title_trans = serializers.CharField()
|
|
||||||
subtitle_trans = serializers.CharField()
|
|
||||||
description_trans = serializers.CharField()
|
|
||||||
|
|
||||||
class Meta:
|
class Meta:
|
||||||
model = models.News
|
model = models.News
|
||||||
fields = [
|
fields = [
|
||||||
|
|
@ -32,6 +36,7 @@ class NewsSerializer(serializers.ModelSerializer):
|
||||||
'end',
|
'end',
|
||||||
'playlist',
|
'playlist',
|
||||||
'address',
|
'address',
|
||||||
|
# Localized fields
|
||||||
'title_trans',
|
'title_trans',
|
||||||
'subtitle_trans',
|
'subtitle_trans',
|
||||||
'description_trans',
|
'description_trans',
|
||||||
|
|
|
||||||
|
|
@ -28,9 +28,8 @@ class NewsCreate(generics.CreateAPIView):
|
||||||
serializer_class = serializers.NewsCreateUpdateSerializer
|
serializer_class = serializers.NewsCreateUpdateSerializer
|
||||||
|
|
||||||
|
|
||||||
class NewsDetail(generics.RetrieveAPIView):
|
class NewsDetail(NewsViewMixin, generics.RetrieveAPIView):
|
||||||
"""News detail view."""
|
"""News detail view."""
|
||||||
queryset = News.objects.all()
|
|
||||||
permission_classes = (permissions.AllowAny, )
|
permission_classes = (permissions.AllowAny, )
|
||||||
serializer_class = serializers.NewsSerializer
|
serializer_class = serializers.NewsSerializer
|
||||||
|
|
||||||
|
|
@ -41,9 +40,8 @@ class NewsDelete(generics.DestroyAPIView):
|
||||||
permission_classes = (permissions.IsAuthenticated, )
|
permission_classes = (permissions.IsAuthenticated, )
|
||||||
|
|
||||||
|
|
||||||
class NewsUpdate(generics.UpdateAPIView):
|
class NewsUpdate(NewsViewMixin, generics.UpdateAPIView):
|
||||||
"""News update view."""
|
"""News update view."""
|
||||||
queryset = News.objects.all()
|
|
||||||
permission_classes = (permissions.IsAuthenticated, )
|
permission_classes = (permissions.IsAuthenticated, )
|
||||||
serializer_class = serializers.NewsCreateUpdateSerializer
|
serializer_class = serializers.NewsCreateUpdateSerializer
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -8,6 +8,9 @@ from django.utils import timezone
|
||||||
from django.utils.html import mark_safe
|
from django.utils.html import mark_safe
|
||||||
from django.utils.translation import ugettext_lazy as _
|
from django.utils.translation import ugettext_lazy as _
|
||||||
from easy_thumbnails.fields import ThumbnailerImageField
|
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):
|
class ProjectBaseMixin(models.Model):
|
||||||
|
|
@ -113,3 +116,38 @@ class PlatformMixin(models.Model):
|
||||||
class Meta:
|
class Meta:
|
||||||
"""Meta class"""
|
"""Meta class"""
|
||||||
abstract = True
|
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()
|
||||||
|
|
|
||||||
|
|
@ -6,7 +6,7 @@ ALLOWED_HOSTS = ['*', ]
|
||||||
SEND_SMS = False
|
SEND_SMS = False
|
||||||
SMS_CODE_SHOW = True
|
SMS_CODE_SHOW = True
|
||||||
|
|
||||||
DOMAIN_URI = 'localhost:8000'
|
DOMAIN_URI = '0.0.0.0:8000'
|
||||||
|
|
||||||
# Increase access token lifetime for local deploy
|
# Increase access token lifetime for local deploy
|
||||||
SIMPLE_JWT['ACCESS_TOKEN_LIFETIME'] = timedelta(days=365)
|
SIMPLE_JWT['ACCESS_TOKEN_LIFETIME'] = timedelta(days=365)
|
||||||
|
|
|
||||||
|
|
@ -27,4 +27,4 @@ django-extensions==2.2.1
|
||||||
django-cors-headers==3.0.2
|
django-cors-headers==3.0.2
|
||||||
|
|
||||||
# JWT
|
# JWT
|
||||||
djangorestframework_simplejwt==4.3.0
|
djangorestframework-simplejwt==4.3.0
|
||||||
Loading…
Reference in New Issue
Block a user