Fix: auto-split rentals with >5 items; update create_done text
This commit is contained in:
@@ -10,7 +10,7 @@ urlpatterns = [
|
|||||||
path("overview/", RentalListView.as_view(), name="index"),
|
path("overview/", RentalListView.as_view(), name="index"),
|
||||||
path("request-rental/", RentalCreateView.as_view(), name="rental_create"),
|
path("request-rental/", RentalCreateView.as_view(), name="rental_create"),
|
||||||
path(
|
path(
|
||||||
"request-rental/<int:pk>/done/",
|
"request-rental/done/",
|
||||||
RentalCreateDoneView.as_view(),
|
RentalCreateDoneView.as_view(),
|
||||||
name="rental_create_done",
|
name="rental_create_done",
|
||||||
),
|
),
|
||||||
|
|||||||
@@ -3,6 +3,7 @@ import datetime
|
|||||||
from datetime import date
|
from datetime import date
|
||||||
|
|
||||||
from django.db.models import Q
|
from django.db.models import Q
|
||||||
|
from django.http import HttpResponseRedirect
|
||||||
from django.shortcuts import render
|
from django.shortcuts import render
|
||||||
from django.urls import reverse
|
from django.urls import reverse
|
||||||
from django.views.generic import ListView, TemplateView
|
from django.views.generic import ListView, TemplateView
|
||||||
@@ -12,6 +13,9 @@ from django.views.generic.edit import CreateView
|
|||||||
from .forms import RentalCreateForm
|
from .forms import RentalCreateForm
|
||||||
from .models import Rental, RentalItem
|
from .models import Rental, RentalItem
|
||||||
|
|
||||||
|
# Maximum number of rental items per rental entry because of table size limitations in PDF file
|
||||||
|
RENTAL_ITEMS_MAX = 5
|
||||||
|
|
||||||
|
|
||||||
def _calc_days_from_current_month(month: date) -> list:
|
def _calc_days_from_current_month(month: date) -> list:
|
||||||
last_day_of_month = month.replace(day=calendar.monthrange(month.year, month.month)[1])
|
last_day_of_month = month.replace(day=calendar.monthrange(month.year, month.month)[1])
|
||||||
@@ -185,7 +189,7 @@ class RentalListView(ListView):
|
|||||||
if rental["rentalitems__name"] not in rental_dict[day]:
|
if rental["rentalitems__name"] not in rental_dict[day]:
|
||||||
rental_dict[day].append(rental["rentalitems__name"])
|
rental_dict[day].append(rental["rentalitems__name"])
|
||||||
|
|
||||||
context["rental_dict"] = rental_dict
|
context["rental_dict"] = {k: sorted(v, key=str.casefold) for k, v in rental_dict.items()}
|
||||||
|
|
||||||
return context
|
return context
|
||||||
|
|
||||||
@@ -223,6 +227,35 @@ class RentalCreateView(CreateView):
|
|||||||
model = Rental
|
model = Rental
|
||||||
template_name = "rental/create.html"
|
template_name = "rental/create.html"
|
||||||
|
|
||||||
|
def form_valid(self, form):
|
||||||
|
# Get unsaved base Rental with all form data
|
||||||
|
base_rental = form.save(commit=False)
|
||||||
|
items = list(form.cleaned_data["rentalitems"])
|
||||||
|
selected_items = sorted(items, key=lambda x: x.name.lower())
|
||||||
|
|
||||||
|
for i in range(0, len(selected_items), RENTAL_ITEMS_MAX):
|
||||||
|
batch = selected_items[i:i + RENTAL_ITEMS_MAX]
|
||||||
|
|
||||||
|
# Clone base_rental — copying all its field values
|
||||||
|
new_rental = Rental.objects.create(
|
||||||
|
firstname=base_rental.firstname,
|
||||||
|
surname=base_rental.surname,
|
||||||
|
matriculation_number=base_rental.matriculation_number,
|
||||||
|
email=base_rental.email,
|
||||||
|
phone=base_rental.phone,
|
||||||
|
organization=base_rental.organization,
|
||||||
|
date_start=base_rental.date_start,
|
||||||
|
date_end=base_rental.date_end,
|
||||||
|
reason=base_rental.reason,
|
||||||
|
comment=base_rental.comment,
|
||||||
|
status=base_rental.status,
|
||||||
|
)
|
||||||
|
|
||||||
|
# Important: Add M2M relations after the object has been saved
|
||||||
|
new_rental.rentalitems.add(*batch)
|
||||||
|
|
||||||
|
return HttpResponseRedirect(self.get_success_url())
|
||||||
|
|
||||||
def get_context_data(self, **kwargs):
|
def get_context_data(self, **kwargs):
|
||||||
context = super().get_context_data(**kwargs)
|
context = super().get_context_data(**kwargs)
|
||||||
|
|
||||||
@@ -231,26 +264,11 @@ class RentalCreateView(CreateView):
|
|||||||
return context
|
return context
|
||||||
|
|
||||||
def get_success_url(self):
|
def get_success_url(self):
|
||||||
return reverse("rental:rental_create_done", kwargs={"pk": self.object.pk})
|
return reverse("rental:rental_create_done")
|
||||||
|
|
||||||
|
|
||||||
class RentalCreateDoneView(TemplateView):
|
class RentalCreateDoneView(TemplateView):
|
||||||
template_name = "rental/create_done.html"
|
template_name = "rental/create_done.html"
|
||||||
|
|
||||||
def get_context_data(self, **kwargs):
|
|
||||||
context = super().get_context_data(**kwargs)
|
|
||||||
|
|
||||||
obj = Rental.objects.get(pk=self.kwargs["pk"])
|
|
||||||
|
|
||||||
total_deposit = 0
|
|
||||||
for elem in obj.rentalitems.all():
|
|
||||||
total_deposit += elem.deposit
|
|
||||||
|
|
||||||
context["object"] = obj
|
|
||||||
context["total_deposit"] = total_deposit
|
|
||||||
|
|
||||||
return context
|
|
||||||
|
|
||||||
|
|
||||||
class RentalItemDetailView(DetailView):
|
class RentalItemDetailView(DetailView):
|
||||||
model = RentalItem
|
model = RentalItem
|
||||||
|
|||||||
@@ -7,7 +7,12 @@
|
|||||||
<main class="container mx-auto w-full px-4 my-8 flex-1 max-w-2xl">
|
<main class="container mx-auto w-full px-4 my-8 flex-1 max-w-2xl">
|
||||||
<section class="block w-full">
|
<section class="block w-full">
|
||||||
<p class="mt-6 text-gray-900 dark:text-gray-100 hyphens-auto" lang="de">
|
<p class="mt-6 text-gray-900 dark:text-gray-100 hyphens-auto" lang="de">
|
||||||
Deine Verleihanfrage mit der Nummer #{{ pk }} wurde erfolgreich eingereicht. Die Gegenstände können am {{ object.date_start }} während der Beratungszeit (Montag - Donnerstag: 09:00 - 14:00, Freitag: 09:00 - 12:00) abgeholt werden. Bitte bring den Gesamtpfand in Höhe von {{ total_deposit }} € in bar mit.
|
Deine Verleihanfrage ist eingegangen - danke dir! 🎉
|
||||||
|
Wir kümmern uns jetzt darum und melden uns per E-Mail mit den nächsten Schritten.
|
||||||
|
</p>
|
||||||
|
<p class="mt-6 text-gray-900 dark:text-gray-100 hyphens-auto" lang="de">
|
||||||
|
Kleiner Hinweis: Bevor du die Sachen abholen kannst, wird deine Anfrage kurz geprüft und freigegeben.
|
||||||
|
Sobald alles genehmigt ist, bekommst du von uns eine Mail.
|
||||||
</p>
|
</p>
|
||||||
<div class="mt-10 flex items-center justify-center">
|
<div class="mt-10 flex items-center justify-center">
|
||||||
<a href="{% url 'home' %}" type="submit" class="block btn btn-primary">Zur Startseite</a>
|
<a href="{% url 'home' %}" type="submit" class="block btn btn-primary">Zur Startseite</a>
|
||||||
|
|||||||
Reference in New Issue
Block a user