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):
"""Return qs with related objects."""
return self.select_related('address', 'establishment_type'). \
prefetch_related('tags')
prefetch_related('tags', 'tags__translation')
def with_schedule(self):
"""Return qs with related schedule."""

View File

@ -74,7 +74,7 @@ class NewsQuerySet(TranslationQuerysetMixin):
def with_base_related(self):
"""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):
"""Return qs with related objects."""

View File

@ -91,7 +91,7 @@ class ProductQuerySet(models.QuerySet):
def with_base_related(self):
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):
"""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 location.models import Country
from utils.models import TJSONField, TagsTranslationModelMixin
from utils.models import TJSONField
class TagQuerySet(models.QuerySet):
@ -29,7 +29,7 @@ class TagQuerySet(models.QuerySet):
return self.filter(category__establishment_types__index_name=index_name)
class Tag(models.Model, TagsTranslationModelMixin):
class Tag(models.Model):
"""Tag model."""
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,
null=True, related_name='tag', verbose_name=_('Translation'))
@property
def label_indexing(self):
return self.translation.text
objects = TagQuerySet.as_manager()
class Meta:
@ -121,7 +125,7 @@ class TagCategoryQuerySet(models.QuerySet):
return self.exclude(tags__isnull=switcher)
class TagCategory(models.Model, TagsTranslationModelMixin):
class TagCategory(models.Model):
"""Tag base category model."""
STRING = 'string'
@ -156,6 +160,10 @@ class TagCategory(models.Model, TagsTranslationModelMixin):
translation = models.OneToOneField('translation.SiteInterfaceDictionary', on_delete=models.SET_NULL,
null=True, related_name='tag_category', verbose_name=_('Translation'))
@property
def label_indexing(self):
return self.translation.text
objects = TagCategoryQuerySet.as_manager()
class Meta:

View File

@ -2,15 +2,25 @@
from rest_framework import serializers
from rest_framework.fields import SerializerMethodField
from establishment.models import Establishment
from establishment.models import EstablishmentType
from establishment.models import Establishment, EstablishmentType
from news.models import News
from news.models import NewsType
from tag import models
from utils.exceptions import BindingObjectNotFound
from utils.exceptions import ObjectAlreadyAdded
from utils.exceptions import RemovedBindingObjectNotFound
from utils.exceptions import BindingObjectNotFound, ObjectAlreadyAdded, RemovedBindingObjectNotFound
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):
@ -19,8 +29,11 @@ class TagBaseSerializer(serializers.ModelSerializer):
def get_extra_kwargs(self):
return super().get_extra_kwargs()
label_translated = TranslatedField()
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:
"""Meta class."""
@ -47,8 +60,10 @@ class TagBackOfficeSerializer(TagBaseSerializer):
class TagCategoryProductSerializer(serializers.ModelSerializer):
"""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:
"""Meta class."""
@ -56,7 +71,6 @@ class TagCategoryProductSerializer(serializers.ModelSerializer):
model = models.TagCategory
fields = (
'id',
'label_translated',
'index_name',
)
@ -64,8 +78,8 @@ class TagCategoryProductSerializer(serializers.ModelSerializer):
class TagCategoryBaseSerializer(serializers.ModelSerializer):
"""Serializer for model TagCategory."""
label_translated = TranslatedField()
tags = SerializerMethodField()
tags = TagBaseSerializer(many=True, allow_null=True)
label_translated = serializers.SerializerMethodField(read_only=True, allow_null=True)
class Meta:
"""Meta class."""
@ -78,33 +92,17 @@ class TagCategoryBaseSerializer(serializers.ModelSerializer):
'tags',
)
def get_tags(self, obj):
query_params = dict(self.context['request'].query_params)
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
def get_label_translated(self, obj):
return translate_obj(obj)
class FiltersTagCategoryBaseSerializer(serializers.ModelSerializer):
"""Serializer for model TagCategory."""
label_translated = TranslatedField()
filters = SerializerMethodField()
param_name = SerializerMethodField()
type = SerializerMethodField()
label_translated = serializers.SerializerMethodField(allow_null=True, read_only=True)
class Meta:
"""Meta class."""
@ -127,6 +125,9 @@ class FiltersTagCategoryBaseSerializer(serializers.ModelSerializer):
return 'wine_colors_id__in'
return 'tags_id__in'
def get_label_translated(self, obj):
return translate_obj(obj)
def get_fields(self, *args, **kwargs):
fields = super(FiltersTagCategoryBaseSerializer, self).get_fields()
@ -157,10 +158,13 @@ class FiltersTagCategoryBaseSerializer(serializers.ModelSerializer):
class TagCategoryShortSerializer(serializers.ModelSerializer):
"""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',
read_only=True)
def get_label_translated(self, obj):
return translate_obj(obj)
class Meta(TagCategoryBaseSerializer.Meta):
"""Meta class."""
fields = [

View File

@ -88,19 +88,6 @@ def translate_field(self, field_name, toggle_field_name=None):
return None
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
class IndexJSON:
@ -147,14 +134,6 @@ class TranslatedFieldsMixin:
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:
"""OAuth2 mixin for project GM"""
@ -463,7 +442,8 @@ class HasTagsMixin(models.Model):
@property
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')
class Meta:

View File

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