2023-04-16 00:43:56 +02:00
|
|
|
from django.shortcuts import render, get_object_or_404, redirect, reverse
|
2023-02-19 23:56:05 +01:00
|
|
|
from django.utils import timezone
|
|
|
|
from django.contrib import messages
|
2023-04-05 23:29:30 +02:00
|
|
|
from django.contrib.auth import login
|
2023-02-19 23:56:05 +01:00
|
|
|
from django.contrib.auth.decorators import login_required
|
2023-04-16 00:43:56 +02:00
|
|
|
from django.views.decorators.csrf import csrf_protect
|
|
|
|
from django.views.decorators.http import require_POST
|
2023-03-31 18:10:38 +02:00
|
|
|
from django.http import HttpResponseForbidden
|
2023-05-16 23:36:40 +02:00
|
|
|
from django.utils.translation import gettext_lazy as _
|
|
|
|
|
2023-02-19 12:29:08 +01:00
|
|
|
|
2023-04-16 00:43:56 +02:00
|
|
|
from .forms import CreateOfferForm, RegistrationForm, FilterForm, WishForm
|
2023-04-05 23:29:30 +02:00
|
|
|
|
2023-04-05 18:18:55 +02:00
|
|
|
from .models import PflaenzliUser, Offer, Wish
|
2023-03-31 23:56:19 +02:00
|
|
|
from .mail import send_offer_email
|
2023-02-20 11:31:10 +01:00
|
|
|
from .upload import generate_unique_filename
|
2023-04-15 13:16:40 +02:00
|
|
|
from .utils.distance import calculate_distance, filter_by_distance
|
2023-02-19 23:56:05 +01:00
|
|
|
|
|
|
|
|
2023-02-20 11:31:10 +01:00
|
|
|
def list_offers(request, filters=None):
|
|
|
|
offers = Offer.objects.all()
|
2023-04-15 13:16:40 +02:00
|
|
|
|
|
|
|
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})
|
2023-02-20 11:31:10 +01:00
|
|
|
|
|
|
|
|
2023-02-19 23:56:05 +01:00
|
|
|
@login_required
|
|
|
|
def create_offer(request):
|
|
|
|
if request.method == "POST":
|
|
|
|
form = CreateOfferForm(request.POST, request.FILES)
|
|
|
|
if form.is_valid():
|
|
|
|
offer = form.save(commit=False)
|
2023-02-20 11:31:10 +01:00
|
|
|
offer.image.name = generate_unique_filename(form.cleaned_data['image'].name)
|
2023-02-19 23:56:05 +01:00
|
|
|
offer.user = request.user
|
2023-04-02 23:03:50 +02:00
|
|
|
offer.title = offer.title.title()
|
2023-02-19 23:56:05 +01:00
|
|
|
offer.save()
|
2023-05-16 23:36:40 +02:00
|
|
|
messages.success(request, _("Offer uploaded successfully!"))
|
2023-02-19 23:56:05 +01:00
|
|
|
return redirect("offer_detail", offer.id)
|
|
|
|
else:
|
|
|
|
form = CreateOfferForm()
|
|
|
|
|
2023-05-16 23:36:40 +02:00
|
|
|
return render(request, "basic_form.html", {"form": form, "button_label": _("Create"), "title": _("Create offer")})
|
2023-02-19 23:56:05 +01:00
|
|
|
|
|
|
|
|
|
|
|
def offer_detail(request, offer_id):
|
|
|
|
offer = get_object_or_404(Offer, id=offer_id)
|
2023-04-09 13:00:40 +02:00
|
|
|
wishes = Wish.objects.filter(user=offer.user)
|
2023-04-26 15:31:14 +02:00
|
|
|
|
|
|
|
if request.user.is_authenticated:
|
|
|
|
if offer.zipcode and request.user.zipcode:
|
|
|
|
if offer.zipcode == request.user.zipcode:
|
|
|
|
dist = 0
|
|
|
|
else:
|
|
|
|
dist = calculate_distance(offer.zipcode, request.user.zipcode)
|
|
|
|
else:
|
|
|
|
dist = None
|
2023-04-09 13:07:50 +02:00
|
|
|
else:
|
|
|
|
dist = None
|
2023-02-19 23:56:05 +01:00
|
|
|
|
2023-04-09 13:07:50 +02:00
|
|
|
return render(request, "offer/detail.html", {"offer": offer, "wishes": wishes, "dist": dist})
|
2023-02-19 23:56:05 +01:00
|
|
|
|
|
|
|
|
2023-03-31 18:10:38 +02:00
|
|
|
@login_required
|
2023-02-19 23:56:05 +01:00
|
|
|
def offer_delete(request, offer_id):
|
2023-03-31 18:10:38 +02:00
|
|
|
offer = get_object_or_404(Offer, id=offer_id)
|
|
|
|
if offer.user != request.user:
|
|
|
|
return HttpResponseForbidden()
|
2023-02-19 23:56:05 +01:00
|
|
|
|
2023-03-31 18:10:38 +02:00
|
|
|
offer.delete()
|
2023-05-16 23:36:40 +02:00
|
|
|
messages.success(request, _("Offer deleted successfully!"))
|
2023-03-31 18:10:38 +02:00
|
|
|
return redirect("list_offers")
|
2023-02-19 23:56:05 +01:00
|
|
|
|
2023-03-31 18:10:38 +02:00
|
|
|
|
|
|
|
@login_required
|
2023-02-19 23:56:05 +01:00
|
|
|
def offer_edit(request, offer_id):
|
2023-03-31 18:10:38 +02:00
|
|
|
offer = get_object_or_404(Offer, id=offer_id)
|
|
|
|
if offer.user != request.user:
|
|
|
|
return HttpResponseForbidden()
|
|
|
|
|
|
|
|
if request.method == "POST":
|
|
|
|
form = CreateOfferForm(request.POST, request.FILES, instance=offer)
|
|
|
|
if form.is_valid():
|
|
|
|
offer = form.save(commit=False)
|
|
|
|
offer.image.name = generate_unique_filename(form.cleaned_data['image'].name)
|
|
|
|
offer.user = request.user
|
|
|
|
offer.save()
|
2023-05-16 23:36:40 +02:00
|
|
|
messages.success(request, _("Offer updated successfully!"))
|
2023-03-31 18:10:38 +02:00
|
|
|
return redirect("offer_detail", offer.id)
|
|
|
|
else:
|
|
|
|
form = CreateOfferForm(instance=offer)
|
|
|
|
|
2023-05-16 23:36:40 +02:00
|
|
|
return render(request, "basic_form.html", {"form": form, "button_label": _("Save"), "title": _("Edit Offer")})
|
2023-02-19 23:56:05 +01:00
|
|
|
|
|
|
|
|
2023-04-16 00:43:56 +02:00
|
|
|
@login_required
|
|
|
|
def wishlist(request, user_id):
|
|
|
|
wishes = Wish.objects.filter(user=user_id)
|
|
|
|
|
|
|
|
if user_id == request.user.id:
|
2023-05-16 23:36:40 +02:00
|
|
|
title = _("Your wishlist")
|
2023-04-16 00:43:56 +02:00
|
|
|
if request.method == "POST":
|
|
|
|
form = WishForm(request.POST)
|
|
|
|
if form.is_valid():
|
|
|
|
wish = form.save(commit=False)
|
|
|
|
wish.user = request.user
|
|
|
|
wish.save()
|
2023-05-16 23:36:40 +02:00
|
|
|
messages.success(request, _("Wish added successfully!"))
|
2023-04-16 00:43:56 +02:00
|
|
|
form = WishForm()
|
|
|
|
else:
|
|
|
|
form = None
|
|
|
|
user = get_object_or_404(PflaenzliUser, id=user_id)
|
2023-05-16 23:36:40 +02:00
|
|
|
title = f"{user.username}'s {_('wishlist')}"
|
2023-04-16 00:43:56 +02:00
|
|
|
|
|
|
|
return render(request, "user/wish.html", {"title": title, "form": form, "wishes": wishes, "own": user_id == request.user.id})
|
|
|
|
|
|
|
|
|
2023-04-26 15:26:17 +02:00
|
|
|
@login_required
|
|
|
|
def user_edit(request):
|
|
|
|
if request.method == "POST":
|
|
|
|
form = RegistrationForm(request.POST, instance=request.user)
|
|
|
|
if form.is_valid():
|
|
|
|
form.save()
|
2023-05-16 23:36:40 +02:00
|
|
|
messages.success(request, _("Account details updated successfully!"))
|
2023-04-26 15:26:17 +02:00
|
|
|
return redirect("user_profile")
|
|
|
|
else:
|
|
|
|
form = RegistrationForm(instance=request.user)
|
|
|
|
|
2023-05-16 23:36:40 +02:00
|
|
|
return render(request, "basic_form.html", {"form": form, "button_label": _("Save"), "title": _("Edit Account Details")})
|
2023-04-26 15:26:17 +02:00
|
|
|
|
|
|
|
|
2023-04-16 00:43:56 +02:00
|
|
|
@csrf_protect
|
|
|
|
@require_POST
|
|
|
|
@login_required
|
|
|
|
def delete_wish(request, wish_id):
|
|
|
|
wish = get_object_or_404(Wish, id=wish_id)
|
|
|
|
|
|
|
|
if wish.user != request.user:
|
|
|
|
messages.error(request, "You don't have permission to delete this wish!")
|
|
|
|
return redirect("wishlist", request.user.id)
|
|
|
|
|
|
|
|
wish.delete()
|
|
|
|
|
|
|
|
return redirect("wishlist", request.user.id)
|
|
|
|
|
|
|
|
|
2023-03-31 23:56:19 +02:00
|
|
|
@login_required
|
2023-02-19 23:56:05 +01:00
|
|
|
def offer_trade(request, offer_id):
|
2023-03-31 23:56:19 +02:00
|
|
|
offer = get_object_or_404(Offer, id=offer_id)
|
|
|
|
sender = request.user
|
|
|
|
recipient = offer.user
|
|
|
|
|
|
|
|
if sender != recipient:
|
|
|
|
send_offer_email(request, offer, sender, recipient)
|
2023-05-16 23:36:40 +02:00
|
|
|
messages.success(request, f"{recipient.username} {_('was successfully notified')}!")
|
2023-03-31 23:56:19 +02:00
|
|
|
else:
|
2023-05-16 23:36:40 +02:00
|
|
|
messages.error(request, _("You can't trade with yourself!"))
|
2023-03-31 23:56:19 +02:00
|
|
|
|
|
|
|
return redirect("offer_detail", offer_id)
|
2023-03-31 23:55:24 +02:00
|
|
|
|
|
|
|
|
|
|
|
def user_detail(request, user_id):
|
2023-04-05 18:18:55 +02:00
|
|
|
user = get_object_or_404(PflaenzliUser, id=user_id)
|
2023-03-31 23:55:24 +02:00
|
|
|
offers = Offer.objects.filter(user=user_id)
|
|
|
|
wishes = Wish.objects.filter(user=user_id)
|
|
|
|
|
|
|
|
return render(request, "user/public.html", {"user": user, "offers": offers, "wishes": wishes})
|
2023-04-05 23:29:30 +02:00
|
|
|
|
|
|
|
|
|
|
|
def register_user(request):
|
|
|
|
if request.method == "POST":
|
|
|
|
form = RegistrationForm(request.POST)
|
|
|
|
if form.is_valid():
|
|
|
|
user = form.save()
|
|
|
|
login(request, user)
|
|
|
|
return redirect("index")
|
|
|
|
else:
|
|
|
|
form = RegistrationForm()
|
|
|
|
|
2023-05-18 12:30:55 +02:00
|
|
|
|
|
|
|
|
|
|
|
def error_404(request, exception):
|
2023-05-18 14:03:35 +02:00
|
|
|
return render(request, '404.html')
|
|
|
|
|
|
|
|
|
|
|
|
def error_403(request, exception):
|
|
|
|
return render(request, '403.html')
|
2023-05-18 12:30:55 +02:00
|
|
|
|
|
|
|
|
|
|
|
def error_500(request):
|
2023-05-18 14:03:35 +02:00
|
|
|
return render(request, '500.html')
|
2023-04-15 13:16:40 +02:00
|
|
|
|
|
|
|
|
|
|
|
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
|