From 20766768d8c7a560766e5ba65650f1f0afdae3f7 Mon Sep 17 00:00:00 2001 From: Anatoly Date: Mon, 23 Sep 2019 10:12:14 +0300 Subject: [PATCH] fixed establishment filter by geo --- apps/establishment/models.py | 4 +--- apps/establishment/views/web.py | 25 ++++++++++++++----------- 2 files changed, 15 insertions(+), 14 deletions(-) diff --git a/apps/establishment/models.py b/apps/establishment/models.py index 042c25e0..ca9fccd3 100644 --- a/apps/establishment/models.py +++ b/apps/establishment/models.py @@ -219,10 +219,8 @@ class EstablishmentQuerySet(models.QuerySet): :return: all establishments within the specified radius of specified point :param unit: length unit e.g. m, km. Default is 'm'. """ - - from django.contrib.gis.measure import Distance kwargs = {unit: radius} - return self.filter(address__coordinates__distance_lte=(center, Distance(**kwargs))) + return self.filter(address__coordinates__distance_lte=(center, DistanceMeasure(**kwargs))) class Establishment(ProjectBaseMixin, URLImageMixin, TranslatedFieldsMixin): diff --git a/apps/establishment/views/web.py b/apps/establishment/views/web.py index 32decde0..78aa3a5f 100644 --- a/apps/establishment/views/web.py +++ b/apps/establishment/views/web.py @@ -1,5 +1,6 @@ """Establishment app views.""" +from django.contrib.gis.geos import Point from django.shortcuts import get_object_or_404 from rest_framework import generics, permissions @@ -104,23 +105,25 @@ class EstablishmentFavoritesCreateDestroyView(generics.CreateAPIView, generics.D return obj -class EstablishmentNearestRetrieveView(EstablishmentMixin, generics.ListAPIView): +class EstablishmentNearestRetrieveView(EstablishmentListView, generics.ListAPIView): """Resource for getting list of nearest establishments.""" serializer_class = serializers.EstablishmentListSerializer filter_class = filters.EstablishmentFilter def get_queryset(self): - """Overrided method 'get_queryset'.""" - from django.contrib.gis.geos import Point + """Overridden method 'get_queryset'.""" + lat = self.request.query_params.get('lat') + lon = self.request.query_params.get('lon') + radius = self.request.query_params.get('radius') + unit = self.request.query_params.get('unit') - center = Point(float(self.request.query_params["lat"]), float(self.request.query_params["lon"])) - radius = float(self.request.query_params["radius"]) - unit = self.request.query_params.get("unit", None) - by_distance_from_point_kwargs = {"center": center, "radius": radius, "unit": unit} - return super(EstablishmentNearestRetrieveView, self).get_queryset() \ - .by_distance_from_point(**{k: v for k, v in by_distance_from_point_kwargs.items() if v is not None}) \ - .by_country_code(code=self.request.country_code) \ - .annotate_in_favorites(user=self.request.user) + qs = super(EstablishmentNearestRetrieveView, self).get_queryset() + if lat and lon and radius and unit: + center = Point(float(lat), float(lon)) + filter_kwargs = {'center': center, 'radius': float(radius), 'unit': unit} + return qs.by_distance_from_point(**{k: v for k, v in filter_kwargs.items() + if v is not None}) + return qs class EstablishmentTagListView(generics.ListAPIView):