Added tags/filters method

This commit is contained in:
dormantman 2019-12-10 19:24:56 +03:00
parent 4ec812d617
commit 096d5dab18
3 changed files with 120 additions and 118 deletions

View File

@ -98,11 +98,13 @@ class TagCategoryBaseSerializer(serializers.ModelSerializer):
return TagBaseSerializer(instance=tags, many=True, read_only=True).data return TagBaseSerializer(instance=tags, many=True, read_only=True).data
class TestBaseSerializer(serializers.ModelSerializer): class FiltersTagCategoryBaseSerializer(serializers.ModelSerializer):
"""Serializer for model TagCategory.""" """Serializer for model TagCategory."""
label_translated = TranslatedField() label_translated = TranslatedField()
tags = SerializerMethodField() filters = SerializerMethodField()
param_name = SerializerMethodField()
type = SerializerMethodField()
class Meta: class Meta:
"""Meta class.""" """Meta class."""
@ -110,17 +112,44 @@ class TestBaseSerializer(serializers.ModelSerializer):
model = models.TagCategory model = models.TagCategory
fields = ( fields = (
'id', 'id',
'transliterated_name', 'label_translated',
'name', 'index_name',
'tags', '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): def get_filters(self, obj):
query_params = dict(self.context['request'].query_params) query_params = dict(self.context['request'].query_params)
if len(query_params) > 1:
return []
params = {} params = {}
if 'establishment_type' in query_params: if 'establishment_type' in query_params:
params = { params = {

View File

@ -7,7 +7,7 @@ app_name = 'tag'
router = SimpleRouter() router = SimpleRouter()
router.register(r'categories', views.TagCategoryViewSet) 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) router.register(r'chosen_tags', views.ChosenTagsView)
urlpatterns = [ urlpatterns = [

View File

@ -11,15 +11,10 @@ from rest_framework import viewsets
from rest_framework.decorators import action from rest_framework.decorators import action
from rest_framework.response import Response from rest_framework.response import Response
from search_indexes import utils from location.models import WineRegion
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 tag import filters from tag import filters
from tag import models from tag import models
from tag import serializers from tag import serializers
from utils.pagination import ESDocumentPagination
class ChosenTagsView(generics.ListAPIView, viewsets.GenericViewSet): class ChosenTagsView(generics.ListAPIView, viewsets.GenericViewSet):
@ -69,116 +64,94 @@ class TagCategoryViewSet(mixins.ListModelMixin, viewsets.GenericViewSet):
# User`s views & viewsets # User`s views & viewsets
class TestTagCategoryViewSet(mixins.ListModelMixin, viewsets.GenericViewSet): class FiltersTagCategoryViewSet(mixins.ListModelMixin, viewsets.GenericViewSet):
"""ViewSet for TagCategory model.""" """ViewSet for TagCategory model."""
filterset_classes = [ filterset_class = filters.TagCategoryFilterSet
filters.TagCategoryFilterSet, pagination_class = None
FilteringFilterBackend,
CustomSearchFilterBackend,
CustomFacetedSearchFilterBackend,
]
document = EstablishmentDocument
pagination_class = ESDocumentPagination
permission_classes = (permissions.AllowAny,) permission_classes = (permissions.AllowAny,)
queryset = models.TagCategory.objects.with_tags().with_base_related(). \ queryset = models.TagCategory.objects.with_tags().with_base_related(). \
distinct() distinct()
serializer_class = serializers.TestBaseSerializer serializer_class = serializers.FiltersTagCategoryBaseSerializer
faceted_search_fields = { def list(self, request, *args, **kwargs):
'works_at_weekday': { queryset = self.filter_queryset(self.get_queryset())
'field': 'works_at_weekday', serializer = self.get_serializer(queryset, many=True)
'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,
},
}
}
search_fields = { result_list = serializer.data
'name': { query_params = request.query_params
'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,
]
},
'works_noon': { if 'toque_number__in' in query_params:
'field': 'works_noon', toques = {
'lookups': [ "index_name": "toque_number",
constants.LOOKUP_QUERY_IN, "label_translated": "Toques",
], "param_name": "toque_number__in",
}, "filters": [{
'works_at_weekday': { "id": toque_id,
'field': 'works_at_weekday', "index_name": "toque_%d" % toque_id,
'lookups': [ "label_translated": "Toque %d" % toque_id
constants.LOOKUP_QUERY_IN, } for toque_id in range(6)]
], }
}, result_list.append(toques)
'works_evening': {
'field': 'works_evening', if 'wine_region_id__in' in query_params:
'lookups': [ try:
constants.LOOKUP_QUERY_IN, wine_region_id = int(query_params['wine_region_id__in'])
],
}, wine_regions = {
'works_now': { "index_name": "wine_region",
'field': 'works_now', "label_translated": "Wine region",
'lookups': [ "param_name": "wine_region_id__in",
constants.LOOKUP_FILTER_TERM, "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 # BackOffice user`s views & viewsets
@ -271,4 +244,4 @@ class TagCategoryBackOfficeViewSet(mixins.CreateModelMixin,
if obj_type == self.bind_object_serializer_class.ESTABLISHMENT_TYPE: if obj_type == self.bind_object_serializer_class.ESTABLISHMENT_TYPE:
tag_category.establishment_types.remove(related_object) tag_category.establishment_types.remove(related_object)
elif obj_type == self.bind_object_serializer_class.NEWS_TYPE: elif obj_type == self.bind_object_serializer_class.NEWS_TYPE:
tag_category.news_types.remove(related_object) tag_category.news_types.remove(related_object)