From 805bda3267ba7dc7a14adb64a558c9b1f1b89fc0 Mon Sep 17 00:00:00 2001 From: evgeniy-st Date: Fri, 30 Aug 2019 17:25:07 +0300 Subject: [PATCH] Extend establishment filterset --- apps/establishment/filters.py | 20 ++++++++++++++++---- apps/establishment/models.py | 22 ++++++++++++++++++---- 2 files changed, 34 insertions(+), 8 deletions(-) diff --git a/apps/establishment/filters.py b/apps/establishment/filters.py index dc391bf6..46960d70 100644 --- a/apps/establishment/filters.py +++ b/apps/establishment/filters.py @@ -1,16 +1,28 @@ -from django_filters import FilterSet +"""Establishment app filters.""" +from django.core.validators import EMPTY_VALUES from django_filters import rest_framework as filters - from establishment import models -class EstablishmentFilter(FilterSet): +class EstablishmentFilter(filters.FilterSet): + """Establishment filterset.""" + tag_id = filters.NumberFilter(field_name='tags__metadata__id',) award_id = filters.NumberFilter(field_name='awards__id',) + search = filters.CharFilter(method='search_text') class Meta: + """Meta class.""" + model = models.Establishment fields = ( 'tag_id', - 'award_id' + 'award_id', + 'search', ) + + def search_text(self, queryset, name, value): + """Search text.""" + if value not in EMPTY_VALUES: + return queryset.search(value, locale=self.request.locale) + return queryset diff --git a/apps/establishment/models.py b/apps/establishment/models.py index 56cc531c..68b8872e 100644 --- a/apps/establishment/models.py +++ b/apps/establishment/models.py @@ -1,4 +1,5 @@ """Establishment models.""" +from functools import reduce from django.core.exceptions import ValidationError from django.db import models from django.utils.translation import gettext_lazy as _ @@ -50,15 +51,26 @@ class EstablishmentSubType(ProjectBaseMixin, TraslatedFieldsMixin): verbose_name = _('Establishment subtype') verbose_name_plural = _('Establishment subtypes') - # def __str__(self): - # """__str__ method.""" - # return self.name - def clean_fields(self, exclude=None): if not self.establishment_type.use_subtypes: raise ValidationError(_('Establishment type is not use subtypes.')) +class EstablishmentQuerySet(models.QuerySet): + """Extended queryset for Establishment model.""" + + def search(self, value, locale=None): + """Search text in JSON fields.""" + if locale is not None: + filters = [ + {f'name__{locale}__icontains': value}, + {f'description__{locale}__icontains': value} + ] + return self.filter(reduce(lambda x, y: x | y, [models.Q(**i) for i in filters])) + else: + return self.none() + + class Establishment(ProjectBaseMixin, ImageMixin, TraslatedFieldsMixin): """Establishment model.""" @@ -89,6 +101,8 @@ class Establishment(ProjectBaseMixin, ImageMixin, TraslatedFieldsMixin): awards = generic.GenericRelation(to='main.Award') tags = generic.GenericRelation(to='main.MetaDataContent') + objects = EstablishmentQuerySet.as_manager() + class Meta: """Meta class."""