Fix: auto-split rentals with >5 items; update create_done text

This commit is contained in:
2025-10-30 12:59:11 +01:00
parent 0e1a61cefc
commit 5d9ad679de
3 changed files with 58 additions and 35 deletions

View File

@@ -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",
),

View File

@@ -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

View File

@@ -1,17 +1,22 @@
{% extends 'base.html' %}
{% block title %}Verleihanfrage erfolgreich eingereicht{% endblock %}
{% block content %}
<!-- Main Content -->
<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.
</p>
<div class="mt-10 flex items-center justify-center">
<a href="{% url 'home' %}" type="submit" class="block btn btn-primary">Zur Startseite</a>
</div>
</section>
</main>
{% endblock content %}
{% extends 'base.html' %}
{% block title %}Verleihanfrage erfolgreich eingereicht{% endblock %}
{% block content %}
<!-- Main Content -->
<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 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>
</div>
</section>
</main>
{% endblock content %}