From 096d5dab1829d6f4f1b0f3d34c17355fca9ee32a Mon Sep 17 00:00:00 2001 From: dormantman Date: Tue, 10 Dec 2019 19:24:56 +0300 Subject: [PATCH] Added tags/filters method --- apps/tag/serializers.py | 45 ++++++++-- apps/tag/urls/web.py | 2 +- apps/tag/views.py | 191 +++++++++++++++++----------------------- 3 files changed, 120 insertions(+), 118 deletions(-) diff --git a/apps/tag/serializers.py b/apps/tag/serializers.py index 2da41d5c..2fea5ad0 100644 --- a/apps/tag/serializers.py +++ b/apps/tag/serializers.py @@ -98,11 +98,13 @@ class TagCategoryBaseSerializer(serializers.ModelSerializer): return TagBaseSerializer(instance=tags, many=True, read_only=True).data -class TestBaseSerializer(serializers.ModelSerializer): +class FiltersTagCategoryBaseSerializer(serializers.ModelSerializer): """Serializer for model TagCategory.""" label_translated = TranslatedField() - tags = SerializerMethodField() + filters = SerializerMethodField() + param_name = SerializerMethodField() + type = SerializerMethodField() class Meta: """Meta class.""" @@ -110,17 +112,44 @@ class TestBaseSerializer(serializers.ModelSerializer): model = models.TagCategory fields = ( 'id', - 'transliterated_name', - 'name', - 'tags', + 'label_translated', + 'index_name', + 'param_name', + 'type', + 'filters', ) + def get_type(self, obj): + return obj in ['open_now', ] + + def get_param_name(self, obj): + if obj == 'service': + return 'tags_id__in' + + elif obj == 'pop': + return 'tags_id__in' + + elif obj == 'open_now': + return 'open_now' + + elif obj == 'wine_region': + return 'wine_region_id__in' + + return '%s__in' % obj.index_name + + def get_fields(self, *args, **kwargs): + fields = super(FiltersTagCategoryBaseSerializer, self).get_fields() + + if self.get_type(self): + fields.pop('filters', None) + else: + fields.pop('type', None) + + return fields + def get_filters(self, obj): query_params = dict(self.context['request'].query_params) - if len(query_params) > 1: - return [] - params = {} if 'establishment_type' in query_params: params = { diff --git a/apps/tag/urls/web.py b/apps/tag/urls/web.py index 7ea45b17..23298d3d 100644 --- a/apps/tag/urls/web.py +++ b/apps/tag/urls/web.py @@ -7,7 +7,7 @@ app_name = 'tag' router = SimpleRouter() router.register(r'categories', views.TagCategoryViewSet) -router.register(r'categories_test', views.TestTagCategoryViewSet) +router.register(r'filters', views.FiltersTagCategoryViewSet) router.register(r'chosen_tags', views.ChosenTagsView) urlpatterns = [ diff --git a/apps/tag/views.py b/apps/tag/views.py index 886d4f9f..fc870fe9 100644 --- a/apps/tag/views.py +++ b/apps/tag/views.py @@ -11,15 +11,10 @@ from rest_framework import viewsets from rest_framework.decorators import action from rest_framework.response import Response -from search_indexes import utils -from search_indexes.documents import EstablishmentDocument -from search_indexes.filters import CustomFacetedSearchFilterBackend -from search_indexes.filters import CustomSearchFilterBackend -from search_indexes.serializers import EstablishmentDocumentSerializer +from location.models import WineRegion from tag import filters from tag import models from tag import serializers -from utils.pagination import ESDocumentPagination class ChosenTagsView(generics.ListAPIView, viewsets.GenericViewSet): @@ -69,116 +64,94 @@ class TagCategoryViewSet(mixins.ListModelMixin, viewsets.GenericViewSet): # User`s views & viewsets -class TestTagCategoryViewSet(mixins.ListModelMixin, viewsets.GenericViewSet): +class FiltersTagCategoryViewSet(mixins.ListModelMixin, viewsets.GenericViewSet): """ViewSet for TagCategory model.""" - filterset_classes = [ - filters.TagCategoryFilterSet, - FilteringFilterBackend, - CustomSearchFilterBackend, - CustomFacetedSearchFilterBackend, - ] - - document = EstablishmentDocument - pagination_class = ESDocumentPagination + filterset_class = filters.TagCategoryFilterSet + pagination_class = None permission_classes = (permissions.AllowAny,) queryset = models.TagCategory.objects.with_tags().with_base_related(). \ distinct() - serializer_class = serializers.TestBaseSerializer + serializer_class = serializers.FiltersTagCategoryBaseSerializer - faceted_search_fields = { - 'works_at_weekday': { - 'field': 'works_at_weekday', - 'facet': TermsFacet, - 'enabled': True, - }, - 'toque_number': { - 'field': 'toque_number', - 'enabled': True, - 'facet': TermsFacet, - }, - 'works_noon': { - 'field': 'works_noon', - 'facet': TermsFacet, - 'enabled': True, - }, - 'works_evening': { - 'field': 'works_evening', - 'facet': TermsFacet, - 'enabled': True, - }, - 'works_now': { - 'field': 'works_now', - 'facet': TermsFacet, - 'enabled': True, - }, - 'tag': { - 'field': 'tags.id', - 'facet': TermsFacet, - 'enabled': True, - 'options': { - 'size': utils.FACET_MAX_RESPONSE, - }, - } - } + def list(self, request, *args, **kwargs): + queryset = self.filter_queryset(self.get_queryset()) + serializer = self.get_serializer(queryset, many=True) - search_fields = { - 'name': { - 'fuzziness': 'auto:2,5', - 'boost': 4 - }, - 'transliterated_name': { - 'fuzziness': 'auto:2,5', - 'boost': 3 - }, - 'description': {'fuzziness': 'auto:2,5'}, - } - translated_search_fields = ( - 'description', - ) - filter_fields = { - 'slug': 'slug', - 'tag': { - 'field': 'tags.id', - 'lookups': [constants.LOOKUP_QUERY_IN] - }, - 'toque_number': { - 'field': 'toque_number', - 'lookups': [ - constants.LOOKUP_FILTER_RANGE, - constants.LOOKUP_QUERY_GT, - constants.LOOKUP_QUERY_GTE, - constants.LOOKUP_QUERY_LT, - constants.LOOKUP_QUERY_LTE, - constants.LOOKUP_QUERY_IN, - ] - }, + result_list = serializer.data + query_params = request.query_params - 'works_noon': { - 'field': 'works_noon', - 'lookups': [ - constants.LOOKUP_QUERY_IN, - ], - }, - 'works_at_weekday': { - 'field': 'works_at_weekday', - 'lookups': [ - constants.LOOKUP_QUERY_IN, - ], - }, - 'works_evening': { - 'field': 'works_evening', - 'lookups': [ - constants.LOOKUP_QUERY_IN, - ], - }, - 'works_now': { - 'field': 'works_now', - 'lookups': [ - constants.LOOKUP_FILTER_TERM, - ] - }, - } + if 'toque_number__in' in query_params: + toques = { + "index_name": "toque_number", + "label_translated": "Toques", + "param_name": "toque_number__in", + "filters": [{ + "id": toque_id, + "index_name": "toque_%d" % toque_id, + "label_translated": "Toque %d" % toque_id + } for toque_id in range(6)] + } + result_list.append(toques) + + if 'wine_region_id__in' in query_params: + try: + wine_region_id = int(query_params['wine_region_id__in']) + + wine_regions = { + "index_name": "wine_region", + "label_translated": "Wine region", + "param_name": "wine_region_id__in", + "filters": [{ + "id": obj.id, + "index_name": obj.name.lower().replace(' ', '_'), + "label_translated": obj.name + } for obj in WineRegion.objects.filter(id=wine_region_id)] + } + + result_list.append(wine_regions) + + except ValueError: + pass + + if 'works_noon__in' in query_params: + week_days = ("Monday", "Tuesday", "Wednesday", "Thursday", "Friday", "Saturday", "Sunday") + works_noon = { + "index_name": "works_noon", + "label_translated": "Open noon", + "param_name": "works_noon__in", + "filters": [{ + "id": weekday, + "index_name": week_days[weekday].lower(), + "label_translated": week_days[weekday] + } for weekday in range(7)] + } + result_list.append(works_noon) + + if 'works_evening__in' in query_params: + week_days = ("Monday", "Tuesday", "Wednesday", "Thursday", "Friday", "Saturday", "Sunday") + works_evening = { + "index_name": "works_evening", + "label_translated": "Open noon", + "param_name": "works_evening__in", + "filters": [{ + "id": weekday, + "index_name": week_days[weekday].lower(), + "label_translated": week_days[weekday] + } for weekday in range(7)] + } + result_list.append(works_evening) + + if 'works_now' in query_params: + works_now = { + "index_name": "open_now", + "label_translated": "Open now", + "param_name": "open_now", + "type": True + } + result_list.append(works_now) + + return Response(result_list) # BackOffice user`s views & viewsets @@ -271,4 +244,4 @@ class TagCategoryBackOfficeViewSet(mixins.CreateModelMixin, if obj_type == self.bind_object_serializer_class.ESTABLISHMENT_TYPE: tag_category.establishment_types.remove(related_object) elif obj_type == self.bind_object_serializer_class.NEWS_TYPE: - tag_category.news_types.remove(related_object) + tag_category.news_types.remove(related_object) \ No newline at end of file