pflaenz.li/pflaenzli/pflaenzli/utils/distance.py

40 lines
1.1 KiB
Python
Raw Normal View History

2023-04-05 15:34:00 +02:00
from geopy.distance import distance
import os
2023-10-15 00:29:21 +02:00
from pflaenzli.models import Plz
2023-04-05 15:34:00 +02:00
2023-10-15 00:29:21 +02:00
def calculate_distance(plz_1: Plz, plz_2: Plz):
if plz_1 == plz_2:
2023-04-15 13:16:40 +02:00
return 0
2023-04-09 13:07:50 +02:00
try:
dist = round(distance((plz_1.lat, plz_1.lon), (plz_2.lat, plz_2.lon)).kilometers)
except AttributeError:
return None
2023-04-05 15:34:00 +02:00
return None if dist > 400 else dist
2023-04-15 13:16:40 +02:00
def filter_by_distance(qs, filter_zipcode, max_dist):
filtered_offers = []
2023-10-15 00:29:21 +02:00
try:
filter_plz = Plz.objects.get(plz=filter_zipcode)
2024-02-10 00:24:57 +01:00
except Plz.MultipleObjectsReturned:
filter_plz = Plz.objects.filter(plz=filter_zipcode)[0]
2023-10-15 00:29:21 +02:00
except Plz.DoesNotExist:
return filtered_offers
2023-04-15 13:16:40 +02:00
for offer in qs:
2024-02-10 00:24:57 +01:00
try:
offer_plz = Plz.objects.get(plz=offer.zipcode)
except Plz.MultipleObjectsReturned:
offer_plz = Plz.objects.filter(plz=offer.zipcode)[0]
except Plz.DoesNotExist:
offer_plz = None
2023-10-15 00:29:21 +02:00
d = calculate_distance(offer_plz, filter_plz)
2023-04-15 13:16:40 +02:00
if d is not None and d <= max_dist:
filtered_offers.append(offer)
return filtered_offers