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])