tags translation

This commit is contained in:
Kuroshini 2019-12-20 19:08:53 +03:00
parent d1699e001e
commit 660c8e791b
7 changed files with 55 additions and 63 deletions

View File

@ -113,7 +113,7 @@ class EstablishmentQuerySet(models.QuerySet):
def with_base_related(self): def with_base_related(self):
"""Return qs with related objects.""" """Return qs with related objects."""
return self.select_related('address', 'establishment_type'). \ return self.select_related('address', 'establishment_type'). \
prefetch_related('tags') prefetch_related('tags', 'tags__translation')
def with_schedule(self): def with_schedule(self):
"""Return qs with related schedule.""" """Return qs with related schedule."""

View File

@ -74,7 +74,7 @@ class NewsQuerySet(TranslationQuerysetMixin):
def with_base_related(self): def with_base_related(self):
"""Return qs with related objects.""" """Return qs with related objects."""
return self.select_related('news_type', 'country').prefetch_related('tags') return self.select_related('news_type', 'country').prefetch_related('tags', 'tags__translation')
def with_extended_related(self): def with_extended_related(self):
"""Return qs with related objects.""" """Return qs with related objects."""

View File

@ -91,7 +91,7 @@ class ProductQuerySet(models.QuerySet):
def with_base_related(self): def with_base_related(self):
return self.select_related('product_type', 'establishment') \ return self.select_related('product_type', 'establishment') \
.prefetch_related('product_type__subtypes') .prefetch_related('product_type__subtypes', 'tags', 'tags__translation')
def with_extended_related(self): def with_extended_related(self):
"""Returns qs with almost all related objects.""" """Returns qs with almost all related objects."""

View File

@ -5,7 +5,7 @@ from django.utils.translation import gettext_lazy as _
from configuration.models import TranslationSettings from configuration.models import TranslationSettings
from location.models import Country from location.models import Country
from utils.models import TJSONField, TagsTranslationModelMixin from utils.models import TJSONField
class TagQuerySet(models.QuerySet): class TagQuerySet(models.QuerySet):
@ -29,7 +29,7 @@ class TagQuerySet(models.QuerySet):
return self.filter(category__establishment_types__index_name=index_name) return self.filter(category__establishment_types__index_name=index_name)
class Tag(models.Model, TagsTranslationModelMixin): class Tag(models.Model):
"""Tag model.""" """Tag model."""
label = TJSONField(blank=True, null=True, default=None, label = TJSONField(blank=True, null=True, default=None,
@ -51,6 +51,10 @@ class Tag(models.Model, TagsTranslationModelMixin):
translation = models.ForeignKey('translation.SiteInterfaceDictionary', on_delete=models.SET_NULL, translation = models.ForeignKey('translation.SiteInterfaceDictionary', on_delete=models.SET_NULL,
null=True, related_name='tag', verbose_name=_('Translation')) null=True, related_name='tag', verbose_name=_('Translation'))
@property
def label_indexing(self):
return self.translation.text
objects = TagQuerySet.as_manager() objects = TagQuerySet.as_manager()
class Meta: class Meta:
@ -121,7 +125,7 @@ class TagCategoryQuerySet(models.QuerySet):
return self.exclude(tags__isnull=switcher) return self.exclude(tags__isnull=switcher)
class TagCategory(models.Model, TagsTranslationModelMixin): class TagCategory(models.Model):
"""Tag base category model.""" """Tag base category model."""
STRING = 'string' STRING = 'string'
@ -156,6 +160,10 @@ class TagCategory(models.Model, TagsTranslationModelMixin):
translation = models.OneToOneField('translation.SiteInterfaceDictionary', on_delete=models.SET_NULL, translation = models.OneToOneField('translation.SiteInterfaceDictionary', on_delete=models.SET_NULL,
null=True, related_name='tag_category', verbose_name=_('Translation')) null=True, related_name='tag_category', verbose_name=_('Translation'))
@property
def label_indexing(self):
return self.translation.text
objects = TagCategoryQuerySet.as_manager() objects = TagCategoryQuerySet.as_manager()
class Meta: class Meta:

View File

@ -2,15 +2,25 @@
from rest_framework import serializers from rest_framework import serializers
from rest_framework.fields import SerializerMethodField from rest_framework.fields import SerializerMethodField
from establishment.models import Establishment from establishment.models import Establishment, EstablishmentType
from establishment.models import EstablishmentType
from news.models import News from news.models import News
from news.models import NewsType from news.models import NewsType
from tag import models from tag import models
from utils.exceptions import BindingObjectNotFound from utils.exceptions import BindingObjectNotFound, ObjectAlreadyAdded, RemovedBindingObjectNotFound
from utils.exceptions import ObjectAlreadyAdded
from utils.exceptions import RemovedBindingObjectNotFound
from utils.serializers import TranslatedField from utils.serializers import TranslatedField
from utils.models import get_default_locale, get_language, to_locale
def translate_obj(obj):
if not obj.translation or not isinstance(obj.translation.text, dict):
return None
try:
field = obj.translation.text
return field.get(to_locale(get_language()),
field.get(get_default_locale(),
next(iter(field.values()))))
except StopIteration:
return None
class TagBaseSerializer(serializers.ModelSerializer): class TagBaseSerializer(serializers.ModelSerializer):
@ -19,8 +29,11 @@ class TagBaseSerializer(serializers.ModelSerializer):
def get_extra_kwargs(self): def get_extra_kwargs(self):
return super().get_extra_kwargs() return super().get_extra_kwargs()
label_translated = TranslatedField()
index_name = serializers.CharField(source='value', read_only=True, allow_null=True) index_name = serializers.CharField(source='value', read_only=True, allow_null=True)
label_translated = serializers.SerializerMethodField(read_only=True, allow_null=True)
def get_label_translated(self, obj):
return translate_obj(obj)
class Meta: class Meta:
"""Meta class.""" """Meta class."""
@ -47,8 +60,10 @@ class TagBackOfficeSerializer(TagBaseSerializer):
class TagCategoryProductSerializer(serializers.ModelSerializer): class TagCategoryProductSerializer(serializers.ModelSerializer):
"""SHORT Serializer for TagCategory""" """SHORT Serializer for TagCategory"""
label_translated = serializers.SerializerMethodField(read_only=True, allow_null=True)
label_translated = TranslatedField() def get_label_translated(self, obj):
return translate_obj(obj)
class Meta: class Meta:
"""Meta class.""" """Meta class."""
@ -56,7 +71,6 @@ class TagCategoryProductSerializer(serializers.ModelSerializer):
model = models.TagCategory model = models.TagCategory
fields = ( fields = (
'id', 'id',
'label_translated',
'index_name', 'index_name',
) )
@ -64,8 +78,8 @@ class TagCategoryProductSerializer(serializers.ModelSerializer):
class TagCategoryBaseSerializer(serializers.ModelSerializer): class TagCategoryBaseSerializer(serializers.ModelSerializer):
"""Serializer for model TagCategory.""" """Serializer for model TagCategory."""
label_translated = TranslatedField() tags = TagBaseSerializer(many=True, allow_null=True)
tags = SerializerMethodField() label_translated = serializers.SerializerMethodField(read_only=True, allow_null=True)
class Meta: class Meta:
"""Meta class.""" """Meta class."""
@ -78,33 +92,17 @@ class TagCategoryBaseSerializer(serializers.ModelSerializer):
'tags', 'tags',
) )
def get_tags(self, obj): def get_label_translated(self, obj):
query_params = dict(self.context['request'].query_params) return translate_obj(obj)
if len(query_params) > 1:
return []
params = {}
if 'establishment_type' in query_params:
params = {
'establishments__isnull': False,
}
elif 'product_type' in query_params:
params = {
'products__isnull': False,
}
tags = obj.tags.filter(**params).distinct()
return TagBaseSerializer(instance=tags, many=True, read_only=True).data
class FiltersTagCategoryBaseSerializer(serializers.ModelSerializer): class FiltersTagCategoryBaseSerializer(serializers.ModelSerializer):
"""Serializer for model TagCategory.""" """Serializer for model TagCategory."""
label_translated = TranslatedField()
filters = SerializerMethodField() filters = SerializerMethodField()
param_name = SerializerMethodField() param_name = SerializerMethodField()
type = SerializerMethodField() type = SerializerMethodField()
label_translated = serializers.SerializerMethodField(allow_null=True, read_only=True)
class Meta: class Meta:
"""Meta class.""" """Meta class."""
@ -127,6 +125,9 @@ class FiltersTagCategoryBaseSerializer(serializers.ModelSerializer):
return 'wine_colors_id__in' return 'wine_colors_id__in'
return 'tags_id__in' return 'tags_id__in'
def get_label_translated(self, obj):
return translate_obj(obj)
def get_fields(self, *args, **kwargs): def get_fields(self, *args, **kwargs):
fields = super(FiltersTagCategoryBaseSerializer, self).get_fields() fields = super(FiltersTagCategoryBaseSerializer, self).get_fields()
@ -157,10 +158,13 @@ class FiltersTagCategoryBaseSerializer(serializers.ModelSerializer):
class TagCategoryShortSerializer(serializers.ModelSerializer): class TagCategoryShortSerializer(serializers.ModelSerializer):
"""Serializer for model TagCategory.""" """Serializer for model TagCategory."""
label_translated = TranslatedField() label_translated = serializers.SerializerMethodField(allow_null=True, read_only=True)
value_type_display = serializers.CharField(source='get_value_type_display', value_type_display = serializers.CharField(source='get_value_type_display',
read_only=True) read_only=True)
def get_label_translated(self, obj):
return translate_obj(obj)
class Meta(TagCategoryBaseSerializer.Meta): class Meta(TagCategoryBaseSerializer.Meta):
"""Meta class.""" """Meta class."""
fields = [ fields = [

View File

@ -88,19 +88,6 @@ def translate_field(self, field_name, toggle_field_name=None):
return None return None
return translate return translate
def translate_by_relation(self):
def translate(self):
field = self.translation.text if self.translation else None
if not isinstance(field, dict):
return None
try:
return field.get(to_locale(get_language()),
field.get(get_default_locale(),
next(iter(field.values()))))
except StopIteration:
return None
return translate
# todo: refactor this # todo: refactor this
class IndexJSON: class IndexJSON:
@ -147,14 +134,6 @@ class TranslatedFieldsMixin:
return value if value else super(TranslatedFieldsMixin, self).__str__() return value if value else super(TranslatedFieldsMixin, self).__str__()
class TagsTranslationModelMixin:
def __init__(self, *args, **kwargs):
super(TagsTranslationModelMixin, self).__init__(*args, **kwargs)
setattr(self.__class__, 'label_translated',
property(translate_by_relation(self)))
setattr(self.__class__, 'label_indexing',
property(lambda self: self.translation.text))
class OAuthProjectMixin: class OAuthProjectMixin:
"""OAuth2 mixin for project GM""" """OAuth2 mixin for project GM"""
@ -463,7 +442,8 @@ class HasTagsMixin(models.Model):
@property @property
def visible_tags(self): def visible_tags(self):
return self.tags.filter(category__public=True).prefetch_related('category')\ return self.tags.filter(category__public=True).prefetch_related('category',
'translation', 'category__translation')\
.exclude(category__value_type='bool') .exclude(category__value_type='bool')
class Meta: class Meta:

View File

@ -86,11 +86,11 @@ LOGGING = {
'py.warnings': { 'py.warnings': {
'handlers': ['console'], 'handlers': ['console'],
}, },
# 'django.db.backends': { 'django.db.backends': {
# 'handlers': ['console', ], 'handlers': ['console', ],
# 'level': 'DEBUG', 'level': 'DEBUG',
# 'propagate': False, 'propagate': False,
# }, },
} }
} }