From 5d9ad679defe2e0a1e173d11280f1cff360c3f90 Mon Sep 17 00:00:00 2001 From: Patrick Mayr Date: Thu, 30 Oct 2025 12:59:11 +0100 Subject: [PATCH] Fix: auto-split rentals with >5 items; update create_done text --- fet2020/rental/urls.py | 2 +- fet2020/rental/views.py | 52 +++++++++++++++-------- fet2020/templates/rental/create_done.html | 39 +++++++++-------- 3 files changed, 58 insertions(+), 35 deletions(-) diff --git a/fet2020/rental/urls.py b/fet2020/rental/urls.py index db656620..4712200f 100644 --- a/fet2020/rental/urls.py +++ b/fet2020/rental/urls.py @@ -10,7 +10,7 @@ urlpatterns = [ path("overview/", RentalListView.as_view(), name="index"), path("request-rental/", RentalCreateView.as_view(), name="rental_create"), path( - "request-rental//done/", + "request-rental/done/", RentalCreateDoneView.as_view(), name="rental_create_done", ), diff --git a/fet2020/rental/views.py b/fet2020/rental/views.py index 88867adc..c4808b7c 100644 --- a/fet2020/rental/views.py +++ b/fet2020/rental/views.py @@ -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 diff --git a/fet2020/templates/rental/create_done.html b/fet2020/templates/rental/create_done.html index bb909c04..48be356c 100644 --- a/fet2020/templates/rental/create_done.html +++ b/fet2020/templates/rental/create_done.html @@ -1,17 +1,22 @@ -{% extends 'base.html' %} - -{% block title %}Verleihanfrage erfolgreich eingereicht{% endblock %} - -{% block content %} - -
-
-

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

- -
-
-{% endblock content %} +{% extends 'base.html' %} + +{% block title %}Verleihanfrage erfolgreich eingereicht{% endblock %} + +{% block content %} + +
+
+

+ Deine Verleihanfrage ist eingegangen - danke dir! 🎉 + Wir kümmern uns jetzt darum und melden uns per E-Mail mit den nächsten Schritten. +

+

+ 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. +

+ +
+
+{% endblock content %}