From 484dce8305159a265b4ed02487f7234508b27fbd Mon Sep 17 00:00:00 2001
From: Patrick Mayr
Date: Tue, 14 Oct 2025 13:44:34 +0200
Subject: [PATCH] add rental calendar
---
fet2020/rental/urls.py | 3 +-
fet2020/rental/views.py | 19 ++++++++++
fet2020/templates/rental/calendar.html | 4 +++
fet2020/templates/rental/rental_calendar.ics | 37 ++++++++++++++++++++
4 files changed, 62 insertions(+), 1 deletion(-)
create mode 100644 fet2020/templates/rental/rental_calendar.ics
diff --git a/fet2020/rental/urls.py b/fet2020/rental/urls.py
index 7703a591..fa946f29 100644
--- a/fet2020/rental/urls.py
+++ b/fet2020/rental/urls.py
@@ -1,11 +1,12 @@
from django.urls import path
-from . import apps
+from . import apps, views
from .views import RentalCreateDoneView, RentalCreateView, RentalItemDetailView, RentalListView
app_name = apps.RentalConfig.name
urlpatterns = [
+ path("rental_calendar.ics", views.rental_calendar, name="calendar"),
path("rental/", RentalListView.as_view(), name="index"),
path("request-rental/", RentalCreateView.as_view(), name="rental_create"),
path(
diff --git a/fet2020/rental/views.py b/fet2020/rental/views.py
index 0262c9a0..f6116094 100644
--- a/fet2020/rental/views.py
+++ b/fet2020/rental/views.py
@@ -2,6 +2,7 @@ import calendar
import datetime
from django.db.models import Q
+from django.shortcuts import render
from django.urls import reverse
from django.views.generic import ListView, TemplateView
from django.views.generic.detail import DetailView
@@ -170,3 +171,21 @@ class RentalCreateDoneView(TemplateView):
class RentalItemDetailView(DetailView):
model = RentalItem
template_name = "rental/rentalitem_detail.html"
+
+
+def rental_calendar(request):
+ """
+ ICS-calendar for outlook, google calender, ...
+ """
+ rentals = Rental.objects.all()
+
+ context = {
+ "rentals": rentals,
+ }
+
+ response = render(request, "rental/rental_calendar.ics", context, content_type="text/calendar")
+
+ # End of line (EOL) must be CRLF, to be compliant with RFC5545. Django/Python set the EOL to LF.
+ response.content = response.content.replace(b"\n", b"\r\n")
+
+ return response
diff --git a/fet2020/templates/rental/calendar.html b/fet2020/templates/rental/calendar.html
index fc419036..8cca61f5 100644
--- a/fet2020/templates/rental/calendar.html
+++ b/fet2020/templates/rental/calendar.html
@@ -13,6 +13,10 @@
Willkommen bei unserem Verleih!
+ {% if user.is_authenticated %}
+ Verleih-Kalender abonnieren
+ {% endif %}
+
Verleih anfragen
diff --git a/fet2020/templates/rental/rental_calendar.ics b/fet2020/templates/rental/rental_calendar.ics
new file mode 100644
index 00000000..6fadc290
--- /dev/null
+++ b/fet2020/templates/rental/rental_calendar.ics
@@ -0,0 +1,37 @@
+BEGIN:VCALENDAR
+VERSION:2.0
+PRODID:-//FET//Verleih Kalender//DE
+METHOD:PUBLISH
+X-WR-CALNAME:Verleih Kalender
+X-WR-CALDESC:Übersicht aller Verleihtermine
+X-WR-TIMEZONE:Europe/Vienna
+BEGIN:VTIMEZONE
+TZID:Europe/Vienna
+BEGIN:STANDARD
+TZOFFSETFROM:+0200
+TZOFFSETTO:+0100
+DTSTART:19961027T030000
+RRULE:FREQ=YEARLY;BYMONTH=10;BYDAY=-1SU
+TZNAME:MEZ
+END:STANDARD
+BEGIN:DAYLIGHT
+TZOFFSETFROM:+0100
+TZOFFSETTO:+0200
+DTSTART:19810329T020000
+RRULE:FREQ=YEARLY;BYMONTH=3;BYDAY=-1SU
+TZNAME:MESZ
+END:DAYLIGHT
+END:VTIMEZONE{% for rental in rentals %}{% for rentalitem in rental.rentalitems.all %}
+BEGIN:VEVENT
+UID:{% now 'Ymd' %}_{{ rental.id }}_{{ rentalitem.id }}@fet.at
+ORGANIZER;CN="Fachschaft Elektrotechnik":MAILTO:verleih@fet.at
+SUMMARY:#{{ rental.id }}: {{ rentalitem.name }} - {{ rental.get_status_display }}
+DESCRIPTION:Anfrage bearbeiten: {{ request.scheme }}://
+ {{ request.get_host }}{% url 'admin:rental_rental_change' rental.id %}
+CLASS:PUBLIC
+DTSTART;TZID=Europe/Vienna:{{ rental.date_start|date:'Ymd' }}
+DTEND;TZID=Europe/Vienna:{{ rental.date_end|date:'Ymd' }}
+DTSTAMP;TZID=Europe/Vienna:{% now 'Ymd' %}T{% now 'His' %}
+TRANSP:TRANSPARENT
+END:VEVENT{% endfor %}{% endfor %}
+END:VCALENDAR
\ No newline at end of file