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.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"""
|
||||
|
|
|
|||
|
|
@ -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',
|
||||
|
|
|
|||
|
|
@ -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
|
||||
|
||||
|
|
|
|||
|
|
@ -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()
|
||||
|
|
|
|||
|
|
@ -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)
|
||||
|
|
|
|||
|
|
@ -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
|
||||
Loading…
Reference in New Issue
Block a user