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 try: dist = round(distance((plz_1.lat, plz_1.lon), (plz_2.lat, plz_2.lon)).kilometers) except AttributeError: return None 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.MultipleObjectsReturned: filter_plz = Plz.objects.filter(plz=filter_zipcode)[0] except Plz.DoesNotExist: return filtered_offers for offer in qs: 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 d = calculate_distance(offer_plz, filter_plz) if d is not None and d <= max_dist: filtered_offers.append(offer) return filtered_offers