gault-millau/apps/search_indexes/views.py
2019-09-30 12:46:58 +03:00

117 lines
3.3 KiB
Python

"""Search indexes app views."""
from rest_framework import permissions
from django_elasticsearch_dsl_drf import constants
from django_elasticsearch_dsl_drf.filter_backends import (FilteringFilterBackend,
GeoSpatialFilteringFilterBackend)
from django_elasticsearch_dsl_drf.viewsets import BaseDocumentViewSet
from utils.pagination import ProjectPageNumberPagination
from search_indexes import serializers, filters
from search_indexes.documents import EstablishmentDocument, NewsDocument
class NewsDocumentViewSet(BaseDocumentViewSet):
"""News document ViewSet."""
document = NewsDocument
lookup_field = 'slug'
pagination_class = ProjectPageNumberPagination
permission_classes = (permissions.AllowAny,)
serializer_class = serializers.NewsDocumentSerializer
ordering = ('id',)
filter_backends = [
filters.CustomSearchFilterBackend,
]
search_fields = (
'title',
'subtitle',
'description',
)
translated_search_fields = (
'title',
'subtitle',
'description',
)
class EstablishmentDocumentViewSet(BaseDocumentViewSet):
"""Establishment document ViewSet."""
document = EstablishmentDocument
lookup_field = 'slug'
pagination_class = ProjectPageNumberPagination
permission_classes = (permissions.AllowAny,)
serializer_class = serializers.EstablishmentDocumentSerializer
ordering = ('id',)
filter_backends = [
FilteringFilterBackend,
filters.CustomSearchFilterBackend,
GeoSpatialFilteringFilterBackend,
]
search_fields = (
'name',
'description',
)
translated_search_fields = (
'description',
)
filter_fields = {
'tag': 'tags.id',
'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,
]
},
'price_level': {
'field': 'price_level',
'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,
]
},
'country_id': {
'field': 'address.city.country.id'
},
'country': {
'field': 'address.city.country.code'
},
'tags_id': {
'field': 'tags.id',
},
'tags_category_id': {
'field': 'tags.category.id',
},
'collection_type': {
'field': 'collections.collection_type'
},
'establishment_type': {
'field': 'establishment_type.id'
},
'establishment_subtypes': {
'field': 'establishment_subtypes.id'
},
}
geo_spatial_filter_fields = {
'location': {
'field': 'address.location',
'lookups': [
constants.LOOKUP_FILTER_GEO_BOUNDING_BOX,
]
}
}