diff --git a/pflaenzli/pflaenzli/utils/distance.py b/pflaenzli/pflaenzli/utils/distance.py
index 2015eca..403f00e 100644
--- a/pflaenzli/pflaenzli/utils/distance.py
+++ b/pflaenzli/pflaenzli/utils/distance.py
@@ -1,6 +1,7 @@
from geopy.distance import distance
import os
from pandas import read_pickle
+from django.db.models import F, Func
path = os.path.dirname(os.path.abspath(__file__))
@@ -9,7 +10,7 @@ df = read_pickle(os.path.join(path, 'plz.pkl'))
def calculate_distance(zip_1, zip_2):
if zip_1 == zip_2:
- return None
+ return 0
zip_1_coords = tuple(df[df.index == zip_1].values)
zip_2_coords = tuple(df[df.index == zip_2].values)
@@ -17,3 +18,12 @@ def calculate_distance(zip_1, zip_2):
dist = round(distance((zip_1_coords), (zip_2_coords)).kilometers)
return None if dist > 400 else dist
+
+
+def filter_by_distance(qs, filter_zipcode, max_dist):
+ filtered_offers = []
+ for offer in qs:
+ d = calculate_distance(int(offer.zipcode), int(filter_zipcode))
+ if d is not None and d <= max_dist:
+ filtered_offers.append(offer)
+ return filtered_offers
diff --git a/pflaenzli/pflaenzli/views.py b/pflaenzli/pflaenzli/views.py
index 4eede75..480c502 100644
--- a/pflaenzli/pflaenzli/views.py
+++ b/pflaenzli/pflaenzli/views.py
@@ -5,17 +5,25 @@ from django.contrib.auth import login
from django.contrib.auth.decorators import login_required
from django.http import HttpResponseForbidden
-from .forms import CreateOfferForm, RegistrationForm
+from .forms import CreateOfferForm, RegistrationForm, FilterForm
from .models import PflaenzliUser, Offer, Wish
from .mail import send_offer_email
from .upload import generate_unique_filename
-from .utils.distance import calculate_distance
+from .utils.distance import calculate_distance, filter_by_distance
def list_offers(request, filters=None):
offers = Offer.objects.all()
- return render(request, "offer/search.html", {"offers": offers})
+
+ if request.method == "POST":
+ form = FilterForm(request.POST, request.FILES)
+ if form.is_valid():
+ offers = filter_offers(offers, form)
+ else:
+ form = FilterForm()
+
+ return render(request, "offer/search.html", {"offers": offers, "form": form})
@login_required
@@ -114,3 +122,16 @@ def register_user(request):
form = RegistrationForm()
return render(request, "basic_form.html", {"form": form, "button_label": "Register", "title": "Registeration"})
+
+
+def filter_offers(offers, form):
+ if form.cleaned_data['text']:
+ offers = offers.filter(title__icontains=form.cleaned_data['text'])
+
+ if form.cleaned_data['zipcode']:
+ if form.cleaned_data['distance']:
+ offers = filter_by_distance(offers, form.cleaned_data['zipcode'], form.cleaned_data['distance'])
+ else:
+ offers = offers.filter(zipcode=int(form.cleaned_data['zipcode']))
+
+ return offers