Order within bounding box from center
This commit is contained in:
parent
1a57d0edd8
commit
376f815c97
|
|
@ -1,10 +1,31 @@
|
||||||
"""Search indexes filters."""
|
"""Search indexes filters."""
|
||||||
from elasticsearch_dsl.query import Q
|
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 search_indexes.utils import OBJECT_FIELD_PROPERTIES
|
||||||
from six import iteritems
|
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):
|
class CustomFacetedSearchFilterBackend(FacetedSearchFilterBackend):
|
||||||
|
|
||||||
def __init__(self):
|
def __init__(self):
|
||||||
|
|
|
||||||
|
|
@ -103,7 +103,7 @@ class EstablishmentDocumentViewSet(BaseDocumentViewSet):
|
||||||
filter_backends = [
|
filter_backends = [
|
||||||
FilteringFilterBackend,
|
FilteringFilterBackend,
|
||||||
filters.CustomSearchFilterBackend,
|
filters.CustomSearchFilterBackend,
|
||||||
GeoSpatialFilteringFilterBackend,
|
filters.CustomGeoSpatialFilteringFilterBackend,
|
||||||
filters.CustomFacetedSearchFilterBackend,
|
filters.CustomFacetedSearchFilterBackend,
|
||||||
GeoSpatialOrderingFilterBackend,
|
GeoSpatialOrderingFilterBackend,
|
||||||
]
|
]
|
||||||
|
|
@ -287,6 +287,12 @@ class EstablishmentDocumentViewSet(BaseDocumentViewSet):
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
geo_spatial_ordering_fields = {
|
||||||
|
'location': {
|
||||||
|
'field': 'address.coordinates',
|
||||||
|
},
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
class MobileEstablishmentDocumentViewSet(EstablishmentDocumentViewSet):
|
class MobileEstablishmentDocumentViewSet(EstablishmentDocumentViewSet):
|
||||||
|
|
||||||
|
|
@ -309,7 +315,7 @@ class ProductDocumentViewSet(BaseDocumentViewSet):
|
||||||
FilteringFilterBackend,
|
FilteringFilterBackend,
|
||||||
filters.CustomSearchFilterBackend,
|
filters.CustomSearchFilterBackend,
|
||||||
filters.CustomFacetedSearchFilterBackend,
|
filters.CustomFacetedSearchFilterBackend,
|
||||||
GeoSpatialOrderingFilterBackend,
|
# GeoSpatialOrderingFilterBackend,
|
||||||
]
|
]
|
||||||
|
|
||||||
search_fields = {
|
search_fields = {
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue
Block a user