30 lines
750 B
Python
30 lines
750 B
Python
from geopy.distance import distance
|
|
import os
|
|
from pflaenzli.models import Plz
|
|
|
|
|
|
def calculate_distance(plz_1: Plz, plz_2: Plz):
|
|
if plz_1 == plz_2:
|
|
return 0
|
|
|
|
dist = round(distance((plz_1.lat, plz_1.lon), (plz_2.lat, plz_2.lon)).kilometers)
|
|
|
|
return None if dist > 400 else dist
|
|
|
|
|
|
def filter_by_distance(qs, filter_zipcode, max_dist):
|
|
filtered_offers = []
|
|
|
|
try:
|
|
filter_plz = Plz.objects.get(plz=filter_zipcode)
|
|
except Plz.DoesNotExist:
|
|
return filtered_offers
|
|
|
|
for offer in qs:
|
|
offer_plz = Plz.objects.get(plz=offer.zipcode)
|
|
|
|
d = calculate_distance(offer_plz, filter_plz)
|
|
if d is not None and d <= max_dist:
|
|
filtered_offers.append(offer)
|
|
return filtered_offers
|