diff --git a/apps/search_indexes/filters.py b/apps/search_indexes/filters.py index c85b1ad0..47af1698 100644 --- a/apps/search_indexes/filters.py +++ b/apps/search_indexes/filters.py @@ -1,10 +1,31 @@ """Search indexes filters.""" from elasticsearch_dsl.query import Q -from django_elasticsearch_dsl_drf.filter_backends import SearchFilterBackend, FacetedSearchFilterBackend +from django_elasticsearch_dsl_drf.filter_backends import SearchFilterBackend, \ + FacetedSearchFilterBackend, GeoSpatialFilteringFilterBackend from search_indexes.utils import OBJECT_FIELD_PROPERTIES from six import iteritems +class CustomGeoSpatialFilteringFilterBackend(GeoSpatialFilteringFilterBackend): + """Automatically adds centering and sorting within bounding box.""" + + @staticmethod + def calculate_center(a, b): + return (a[0] + b[0]) / 2, (a[1] + b[1]) / 2 + + def filter_queryset(self, request, queryset, view): + ret = super().filter_queryset(request, queryset, view) + bb = request.query_params.get('location__geo_bounding_box') + if bb: + center = self.calculate_center(*map(lambda p: list(map(lambda x: float(x),p.split(','))), bb.split('__'))) + request.GET._mutable = True + request.query_params.update({ + 'ordering': f'location__{center[0]}__{center[1]}__km' + }) + request.GET._mutable = False + return ret + + class CustomFacetedSearchFilterBackend(FacetedSearchFilterBackend): def __init__(self): diff --git a/apps/search_indexes/views.py b/apps/search_indexes/views.py index 74cd4649..7f262762 100644 --- a/apps/search_indexes/views.py +++ b/apps/search_indexes/views.py @@ -103,7 +103,7 @@ class EstablishmentDocumentViewSet(BaseDocumentViewSet): filter_backends = [ FilteringFilterBackend, filters.CustomSearchFilterBackend, - GeoSpatialFilteringFilterBackend, + filters.CustomGeoSpatialFilteringFilterBackend, filters.CustomFacetedSearchFilterBackend, GeoSpatialOrderingFilterBackend, ] @@ -287,6 +287,12 @@ class EstablishmentDocumentViewSet(BaseDocumentViewSet): } } + geo_spatial_ordering_fields = { + 'location': { + 'field': 'address.coordinates', + }, + } + class MobileEstablishmentDocumentViewSet(EstablishmentDocumentViewSet): @@ -309,7 +315,7 @@ class ProductDocumentViewSet(BaseDocumentViewSet): FilteringFilterBackend, filters.CustomSearchFilterBackend, filters.CustomFacetedSearchFilterBackend, - GeoSpatialOrderingFilterBackend, + # GeoSpatialOrderingFilterBackend, ] search_fields = {