JourneyJoker/auction/views.py

107 lines
No EOL
3.6 KiB
Python

from django.views.generic import CreateView, UpdateView, View, ListView, DetailView
from django.shortcuts import redirect, get_object_or_404
from django.contrib import messages
from django.urls import reverse
from django.contrib.gis.geos import Point
from django.db.models import F
from django.contrib.gis.db.models.functions import Distance
from public.mixins import InConstructionMixin
from partners.mixins import PartnerProfileRequiredMixin
from localauth.helpers import name_to_coords
from partners.models import Establishment
from .models import Inquiry, Offer
from .forms import InquiryProcessForm
class InquiryCreateView(CreateView):
model = Inquiry
fields = ["destination_name", "budget", "arrival", "min_nights", "adults", "children"]
def get(self, request, *args, **kwargs):
return redirect("/")
def form_valid(self, form):
form.instance.destination_coords = self.clean_destination_coords()
form.instance.destination_radius = 0
return super().form_valid(form)
def form_invalid(self, form, *args, **kwargs):
for field in form:
for error in field.errors:
messages.error(self.request, f"{field.name}: {error}")
return redirect("/")
def get_success_url(self):
return reverse("auction:process_inquiry", args=(self.object.uuid,))
def clean_destination_coords(self):
lat, lon = name_to_coords(self.request.POST.get("destination_name"))
return Point(lon, lat)
class InquiryProcessView(InConstructionMixin, UpdateView):
form_class = InquiryProcessForm
model = Inquiry
template_name = "auction/process.html"
def get_object(self):
return Inquiry.objects.get(uuid=self.kwargs["uuid"])
def get_initial(self):
initial = super().get_initial()
try:
initial["country"] = self.request.user.clientprofile.country.code
except:
pass
return initial
class InquiryPaymentView(InConstructionMixin, View):
pass
class OfferSelectionView(InConstructionMixin, DetailView):
model = Inquiry
template_name = "auction/offer_select.html"
def get_object(self):
return get_object_or_404(Inquiry, uuid=self.kwargs["uuid"])
class OfferSelectionTableView(InConstructionMixin, ListView):
model = Offer
content_type = "text/javascript"
template_name = "auction/offer_table.js"
def get_queryset(self):
inquiry = get_object_or_404(Inquiry, uuid=self.kwargs["uuid"])
class BiddingListView(InConstructionMixin, PartnerProfileRequiredMixin, ListView):
model = Inquiry
template_name = "auction/bidding_list.html"
def dispatch(self, request, *args, **kwargs):
self.establishment = self.get_establishment()
if not self.establishment:
messages.warning(request, "Um bieten zu können, muss zuerst eine Unterkunft im System hinterlegt werden!")
return redirect("partners:establishment_register")
return super().dispatch(request, *args, **kwargs)
def get_establishment(self):
establishment = self.kwargs.get("id", None)
kwargs = {"owner": self.request.user.partnerprofile}
if establishment:
kwargs["id"] = establishment
if establishment:
return get_object_or_404(Establishment, **kwargs)
else:
return Establishment.objects.filter(**kwargs).first()
def get_queryset(self):
establishment = self.get_establishment()
inquiries = Inquiry.objects.annotate(distance=Distance("destination_coords", establishment.coords))
return inquiries.filter(active=True) #, distance__lte=F("destination_radius"))