get radius ubications

This commit is contained in:
Diego Calvo
2021-04-05 15:03:15 +02:00
parent 8ade7743fc
commit 0c3c1db623

View File

@@ -7,6 +7,7 @@ from django.db.models import Q
from django.core import serializers from django.core import serializers
from django.core.validators import validate_email from django.core.validators import validate_email
from django.contrib.auth import get_user_model from django.contrib.auth import get_user_model
from django.contrib.gis.geos import Point
from django.template.loader import render_to_string from django.template.loader import render_to_string
from django.core.mail import EmailMessage from django.core.mail import EmailMessage
from django.db.models import Max, Min from django.db.models import Max, Min
@@ -176,8 +177,10 @@ def product_search(request):
price_min = request.GET.get('price_min', None) price_min = request.GET.get('price_min', None)
price_max = request.GET.get('price_max', None) price_max = request.GET.get('price_max', None)
order = request.GET.get('order', '') order = request.GET.get('order', '')
latitude = request.GET.get('latitude', None)
longitude = request.GET.get('longitude', None)
try: # try:
# we collect our results here # we collect our results here
result_set = set() result_set = set()
# values for response # values for response
@@ -225,6 +228,17 @@ def product_search(request):
# only intances without shpping costs # only intances without shpping costs
products_qs = products_qs.filter(Q(discount=None)|Q(discount=0.00)) products_qs = products_qs.filter(Q(discount=None)|Q(discount=0.00))
if latitude is not None and longitude is not None:
coordinates = (float(longitude), float(latitude))
# (n km / 40,000 km * 360 degrees) = radius length degrees
# Radiuses: 10km, 50km, 200km
radiuses = [0.09, 0.45, 1.8]
for radius in reversed(radiuses):
products_geo_filtered = products_qs.filter(company__geo__dwithin=(Point(coordinates), radius))
if len(products_geo_filtered) >= 10:
products_qs = products_geo_filtered
# filter by price # filter by price
if price_min is not None: if price_min is not None:
products_qs = products_qs.filter(price__gte=price_min) products_qs = products_qs.filter(price__gte=price_min)
@@ -277,8 +291,8 @@ def product_search(request):
limit = int(limit) limit = int(limit)
result_list = result_list[:limit] result_list = result_list[:limit]
return Response(data={"filters": filters, "count": total_results, "products": result_list, 'prices': prices}) return Response(data={"filters": filters, "count": total_results, "products": result_list, 'prices': prices})
except Exception as e: # except Exception as e:
return Response({"errors": {"details": str(e)}}, status=status.HTTP_500_INTERNAL_SERVER_ERROR) # return Response({"errors": {"details": str(e)}}, status=status.HTTP_500_INTERNAL_SERVER_ERROR)
class CategoryTagAutocomplete(autocomplete.Select2QuerySetView): class CategoryTagAutocomplete(autocomplete.Select2QuerySetView):