diff --git a/apps/news/models.py b/apps/news/models.py index ca0f2887..9a0c19d8 100644 --- a/apps/news/models.py +++ b/apps/news/models.py @@ -7,6 +7,7 @@ from rest_framework.reverse import reverse from rating.models import Rating from utils.models import BaseAttributes, TJSONField, TranslatedFieldsMixin, ProjectBaseMixin +from utils.querysets import TranslationQuerysetMixin class NewsType(models.Model): @@ -27,7 +28,7 @@ class NewsType(models.Model): return self.name -class NewsQuerySet(models.QuerySet): +class NewsQuerySet(TranslationQuerysetMixin): """QuerySet for model News""" def rating_value(self): diff --git a/apps/news/views.py b/apps/news/views.py index 9cbe6b53..e8042c62 100644 --- a/apps/news/views.py +++ b/apps/news/views.py @@ -21,8 +21,10 @@ class NewsMixinView: from django.conf import settings """Override get_queryset method.""" - qs = models.News.objects.published().with_base_related() \ - .order_by('-is_highlighted', '-created') + qs = models.News.objects.published() \ + .has_translation(self.request.locale) \ + .with_base_related() \ + .order_by('-is_highlighted', '-created') country_code = self.request.country_code if country_code: diff --git a/apps/utils/methods.py b/apps/utils/methods.py index 28ac55df..ed4fe7bc 100644 --- a/apps/utils/methods.py +++ b/apps/utils/methods.py @@ -11,7 +11,6 @@ from django.http.request import HttpRequest from django.utils.timezone import datetime from rest_framework import status from rest_framework.request import Request -from os.path import exists logger = logging.getLogger(__name__) diff --git a/apps/utils/querysets.py b/apps/utils/querysets.py index 45798fbb..e11a7c10 100644 --- a/apps/utils/querysets.py +++ b/apps/utils/querysets.py @@ -6,6 +6,7 @@ from django.db import models from django.db.models import Q, F from utils.methods import get_contenttype +from utils.models import TJSONField class ContentTypeQuerySetMixin(models.QuerySet): @@ -56,3 +57,24 @@ class RelatedObjectsCountMixin(models.QuerySet): return self._annotate_related_objects_count()\ .annotate(all_related_count=exp)\ .filter(all_related_count__gt=count) + + +class TranslationQuerysetMixin(models.QuerySet): + + def _get_translatable_fields(self): + """Get translatable fields from model.""" + translatable_fields = [] + model = self.model + for field in model._meta.fields: + field_name = field.name + if isinstance(field, TJSONField): + translatable_fields.append(field_name) + return translatable_fields + + def _get_translatable_field_filters(self, locale: str): + """Generate filters for filtering TJSON objects that has necessary locale.""" + return {f'{field}__has_key': locale for field in self._get_translatable_fields()} + + def has_translation(self, locale: str): + """Filter objects by locale from request.""" + return self.filter(**self._get_translatable_field_filters(locale))