JourneyJoker/partners/views.py

251 lines
No EOL
9.3 KiB
Python

from django.views.generic import CreateView, UpdateView, ListView, DetailView, FormView
from django.urls import reverse_lazy
from django.http import HttpResponseRedirect
from django.shortcuts import get_list_or_404, redirect, get_object_or_404
from django.contrib import messages
from .models import PartnerProfile, Establishment, RoomCategory
from .mixins import PartnerProfileRequiredMixin
from .forms import VerificationForm
from auction.models import Inquiry, Offer
from public.mixins import InConstructionMixin
from localauth.mixins import LoginRequiredMixin, SuperUserRequiredMixin
from gallery.models import Image
class PartnerRegistrationView(InConstructionMixin, LoginRequiredMixin, CreateView):
model = PartnerProfile
exclude = ["user"]
template_name = "partners/signup.html"
fields = ["company", "vat_id", "first_name", "last_name", "street", "city", "zip", "state", "country", "phone"]
def dispatch(self, request, *args, **kwargs):
try:
PartnerProfile.objects.get(user=request.user)
return HttpResponseRedirect(reverse_lazy("partners:profile"))
except (PartnerProfile.DoesNotExist, TypeError):
return super().dispatch(request, *args, **kwargs)
def form_valid(self, form):
form.instance.user = self.request.user
return super().form_valid(form)
def get_success_url(self):
messages.success(self.request, "Profil erfolgreich angelegt!")
return reverse_lazy("partners:profile")
def get_initial(self):
try:
client = self.request.user.clientprofile
return {
"company": client.company,
"vat_id": client.vat_id,
"first_name": client.first_name,
"last_name": client.last_name,
"street": client.street,
"city": client.city,
"zip": client.zip,
"state": client.state,
"country": client.country,
"phone": client.phone
}
except:
return {
"country": "AT",
"phone": "+43"
}
class PartnerProfileView(InConstructionMixin, PartnerProfileRequiredMixin, UpdateView):
model = PartnerProfile
exclude = ["user"]
template_name = "partners/profile.html"
fields = ["company", "vat_id", "first_name", "last_name", "street", "city", "zip", "state", "country"]
def get_success_url(self):
return reverse_lazy("partners:profile")
def get_object(self, queryset=None):
return self.request.user.partnerprofile
class OffersListView(InConstructionMixin, PartnerProfileRequiredMixin, ListView):
model = Offer
template_name = "partners/offer_list.html"
def get_queryset(self):
return Offer.objects.filter(roomcategory__in=self.request.user.partnerprofile.roomcategory_set.all())
class EstablishmentsListView(InConstructionMixin, PartnerProfileRequiredMixin, ListView):
model = Establishment
template_name = "partners/establishment_list.html"
def get_queryset(self):
return self.request.user.partnerprofile.establishment_set.all()
class RoomCategoryListView(InConstructionMixin, PartnerProfileRequiredMixin, CreateView, ListView):
model = RoomCategory
template_name = "partners/roomcategory_list.html"
fields = ["name", "average_price"]
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
return get_object_or_404(Establishment, **kwargs)
else:
return Establishment.objects.filter(**kwargs).first()
def get_queryset(self):
establishment = self.establishment
return RoomCategory.objects.filter(establishment=establishment)
def get_context_data(self, **kwargs):
context = super().get_context_data(**kwargs)
context["establishment"] = self.establishment
return context
def form_valid(self, form):
form.instance.establishment = self.establishment
return super().form_valid(form)
def get_success_url(self):
return reverse_lazy("partners:roomcategories", args=[self.establishment.id])
class EstablishmentRequestView(InConstructionMixin, PartnerProfileRequiredMixin, CreateView):
model = Establishment
template_name = "partners/establishment_register.html"
fields = ["name", "stars", "superior", "street", "city", "zip", "state", "country", "image"]
def form_valid(self, form):
form.instance.owner = self.request.user.partnerprofile
retval = super().form_valid(form)
RoomCategory.objects.create(name="Einzelzimmer", average_price=100, active=False, establishment=form.instance) # TODO: Move somewhere better
RoomCategory.objects.create(name="Doppelzimmer", average_price=100, active=False, establishment=form.instance)
return retval
def get_success_url(self):
return reverse_lazy("partners:establishments")
class PartnerDashboardView(InConstructionMixin, PartnerProfileRequiredMixin, DetailView):
model = PartnerProfile
template_name = "partners/dashboard.html"
def get_object(self):
return self.request.user.partnerprofile
class EstablishmentVerificationView(SuperUserRequiredMixin, FormView):
form_class = VerificationForm
template_name = "partners/establishment_verify.html"
def form_valid(self, form):
eid = form.cleaned_data["establishment"]
eobj = Establishment.objects.filter(id=eid)
eobj.update(verified=True)
messages.success(self.request, "Unterkunft %s bestätigt!" % eobj[0].name)
return HttpResponseRedirect(reverse_lazy("partners:establishment_verify"))
class EstablishmentGalleryManagementView(PartnerProfileRequiredMixin, CreateView, ListView):
model = Image
template_name = "partners/establishment_gallery_manage.html"
fields = ["image", "title", "comment"]
def dispatch(self, request, *args, **kwargs):
self.establishment = self.get_establishment()
self.object_list = self.get_queryset()
if not self.establishment:
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
return get_object_or_404(Establishment, **kwargs)
else:
return Establishment.objects.filter(**kwargs).first()
def get_queryset(self):
establishment = self.establishment
return establishment.image_set.all()
def get_context_data(self, **kwargs):
context = super().get_context_data(**kwargs)
context["establishment"] = self.establishment
return context
def form_valid(self, form):
form.instance.content_object = self.establishment
for filename, file in self.request.FILES.items():
name = self.request.FILES[filename].name
form.instance.upload_path = f"userfiles/{self.request.user.id}/{name}" # TODO: Make unique
return super().form_valid(form)
def get_success_url(self):
return reverse_lazy("partners:establishment_gallery", args=[self.establishment.id])
class RoomCategoryGalleryManagementView(PartnerProfileRequiredMixin, CreateView, ListView):
model = Image
template_name = "partners/roomcategory_gallery_manage.html"
fields = ["image", "title", "comment"]
def dispatch(self, request, *args, **kwargs):
self.roomcategory = self.get_roomcategory()
self.object_list = self.get_queryset()
if not self.roomcategory:
return redirect("partners:establishment_register")
return super().dispatch(request, *args, **kwargs)
def get_roomcategory(self):
roomcategory = self.kwargs.get("cid", None)
kwargs = {} # TODO: Check for user permission!
if roomcategory:
kwargs["id"] = roomcategory
return get_object_or_404(RoomCategory, **kwargs)
else:
return RoomCategory.objects.filter(**kwargs).first()
def get_queryset(self):
roomcategory = self.roomcategory
return roomcategory.image_set.all()
def get_context_data(self, **kwargs):
context = super().get_context_data(**kwargs)
context["roomcategory"] = self.roomcategory
return context
def form_valid(self, form):
form.instance.content_object = self.roomcategory
for filename, file in self.request.FILES.items():
name = self.request.FILES[filename].name
form.instance.upload_path = f"userfiles/{self.request.user.id}/{name}" # TODO: Make unique
return super().form_valid(form)
def get_success_url(self):
return reverse_lazy("partners:roomcategory_gallery", args=[self.roomcategory.establishment.id, self.roomcategory.id])