From 5fd334f7fa27452d2f35a9f037a40a1452e547b3 Mon Sep 17 00:00:00 2001 From: joseph Date: Sat, 20 Apr 2024 11:43:14 +0200 Subject: [PATCH] respect RFC 5545 for ics export --- colloscope/icalexport.py | 43 ++++++++++++++++++++++++++++++++++------ 1 file changed, 37 insertions(+), 6 deletions(-) diff --git a/colloscope/icalexport.py b/colloscope/icalexport.py index 355b116..ed85083 100644 --- a/colloscope/icalexport.py +++ b/colloscope/icalexport.py @@ -1,16 +1,41 @@ from datetime import date, time, datetime, timedelta from pytz import timezone +from uuid import uuid4 from icalendar import Calendar, Event, vCalAddress, vText from colloscope.models import * +LOCAL_TZ = "Europe/Paris" + def to_calendar(etudiant, periode): cal = Calendar() cal.add("prodid", "-//Colloscope//colles.mp2i-vms.fr//") cal.add("version", "2.0") + cal.add( + """ + BEGIN:VTIMEZONE + TZID:Europe/Paris + X-LIC-LOCATION:Europe/Paris + BEGIN:DAYLIGHT + TZOFFSETFROM:+0100 + TZOFFSETTO:+0200 + TZNAME:CEST + DTSTART:19700329T020000 + RRULE:FREQ=YEARLY;BYMONTH=3;BYDAY=-1SU + END:DAYLIGHT + BEGIN:STANDARD + TZOFFSETFROM:+0200 + TZOFFSETTO:+0100 + TZNAME:CET + DTSTART:19701025T030000 + RRULE:FREQ=YEARLY;BYMONTH=10;BYDAY=-1SU + END:STANDARD + END:VTIMEZONE + """ + ) rotations = Rotation.objects \ .filter(groupes__membres=etudiant) \ @@ -20,19 +45,25 @@ def to_calendar(etudiant, periode): for rotation in rotations: event = Event() - event.add("name", "Colle") - event.add("summary", str(rotation)) + + summary = f"Colle {rotation.creneau.matiere} ({rotation.creneau.colleur})" + event.add("summary", summary) start = rotation.datetime() fin = start + rotation.creneau.duree - event.add("dtstart", start) - event.add("dtend", fin) + event.add("dtstart", start, parameters={"tzid": LOCAL_TZ}) + event.add("dtend", fin, parameters={"tzid": LOCAL_TZ}) event.add("dtstamp", datetime.now()) + event.add("uid", str(uuid4())) + event.add("location", f"{rotation.creneau.salle} ({rotation.creneau.periode.classe.lycee})") - event.add("matiere", str(rotation.creneau.matiere)) + event.add("categories", "COLLE-" + str(rotation.creneau.matiere)) + description = "Groupes: {','.join(str(groupe) for groupe in rotation.groupes.all())}" + event.add(description) + organizer = vCalAddress("mailto:unknown@mp2i-vms.fr") organizer.params["cn"] = vText(str(rotation.creneau.colleur)) organizer.params["role"] = vText("Colleur") @@ -40,8 +71,8 @@ def to_calendar(etudiant, periode): for e in rotation.groupe_effectif(): attendee = vCalAddress("mailto:unknown@mp2i-vms.fr") - attendee.params["cn"] = vText(str(e)) attendee.params["role"] = vText("Etudiant") + attendee.params["cn"] = vText(str(e)) event.add("attendee", attendee, encode=0)