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("request-rental/", RentalCreateView.as_view(), name="rental_create"),
|
||||
path(
|
||||
"request-rental/<int:pk>/done/",
|
||||
"request-rental/done/",
|
||||
RentalCreateDoneView.as_view(),
|
||||
name="rental_create_done",
|
||||
),
|
||||
|
||||
@@ -3,6 +3,7 @@ import datetime
|
||||
from datetime import date
|
||||
|
||||
from django.db.models import Q
|
||||
from django.http import HttpResponseRedirect
|
||||
from django.shortcuts import render
|
||||
from django.urls import reverse
|
||||
from django.views.generic import ListView, TemplateView
|
||||
@@ -12,6 +13,9 @@ from django.views.generic.edit import CreateView
|
||||
from .forms import RentalCreateForm
|
||||
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:
|
||||
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]:
|
||||
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
|
||||
|
||||
@@ -223,6 +227,35 @@ class RentalCreateView(CreateView):
|
||||
model = Rental
|
||||
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):
|
||||
context = super().get_context_data(**kwargs)
|
||||
|
||||
@@ -231,26 +264,11 @@ class RentalCreateView(CreateView):
|
||||
return context
|
||||
|
||||
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):
|
||||
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):
|
||||
model = RentalItem
|
||||
|
||||
@@ -7,7 +7,12 @@
|
||||
<main class="container mx-auto w-full px-4 my-8 flex-1 max-w-2xl">
|
||||
<section class="block w-full">
|
||||
<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>
|
||||
<div class="mt-10 flex items-center justify-center">
|
||||
<a href="{% url 'home' %}" type="submit" class="block btn btn-primary">Zur Startseite</a>
|
||||
|
||||
Reference in New Issue
Block a user