diff --git a/apps/establishment/models.py b/apps/establishment/models.py index b4655b24..cde60618 100644 --- a/apps/establishment/models.py +++ b/apps/establishment/models.py @@ -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.""" diff --git a/apps/news/models.py b/apps/news/models.py index ab65ed88..64b22ffb 100644 --- a/apps/news/models.py +++ b/apps/news/models.py @@ -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.""" diff --git a/apps/product/models.py b/apps/product/models.py index 3541122b..2c2081c9 100644 --- a/apps/product/models.py +++ b/apps/product/models.py @@ -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.""" diff --git a/apps/tag/models.py b/apps/tag/models.py index 973cc326..7685cfd0 100644 --- a/apps/tag/models.py +++ b/apps/tag/models.py @@ -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: diff --git a/apps/tag/serializers.py b/apps/tag/serializers.py index b5e5a267..2155de73 100644 --- a/apps/tag/serializers.py +++ b/apps/tag/serializers.py @@ -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 = [ diff --git a/apps/utils/models.py b/apps/utils/models.py index 910b8473..42e35bb1 100644 --- a/apps/utils/models.py +++ b/apps/utils/models.py @@ -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: diff --git a/project/settings/local.py b/project/settings/local.py index d9c7cab8..b101d78e 100644 --- a/project/settings/local.py +++ b/project/settings/local.py @@ -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, + }, } }