respect RFC 5545 for ics export

This commit is contained in:
joseph 2024-04-20 11:43:14 +02:00
parent b48c601e7b
commit 941c5c69b6
1 changed files with 37 additions and 6 deletions

View File

@ -1,16 +1,41 @@
from datetime import date, time, datetime, timedelta from datetime import date, time, datetime, timedelta
from pytz import timezone from pytz import timezone
from uuid import uuid4
from icalendar import Calendar, Event, vCalAddress, vText from icalendar import Calendar, Event, vCalAddress, vText
from colloscope.models import * from colloscope.models import *
LOCAL_TZ = "Europe/Paris"
def to_calendar(etudiant, periode): def to_calendar(etudiant, periode):
cal = Calendar() cal = Calendar()
cal.add("prodid", "-//Colloscope//colles.mp2i-vms.fr//") cal.add("prodid", "-//Colloscope//colles.mp2i-vms.fr//")
cal.add("version", "2.0") 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 \ rotations = Rotation.objects \
.filter(groupes__membres=etudiant) \ .filter(groupes__membres=etudiant) \
@ -20,18 +45,24 @@ def to_calendar(etudiant, periode):
for rotation in rotations: for rotation in rotations:
event = Event() 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() start = rotation.datetime()
fin = start + rotation.creneau.duree fin = start + rotation.creneau.duree
event.add("dtstart", start) event.add("dtstart", start, parameters={"tzid": LOCAL_TZ})
event.add("dtend", fin) event.add("dtend", fin, parameters={"tzid": LOCAL_TZ})
event.add("dtstamp", datetime.now()) event.add("dtstamp", datetime.now())
event.add("uid", str(uuid4()))
event.add("location", f"{rotation.creneau.salle} ({rotation.creneau.periode.classe.lycee})") 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 = vCalAddress("mailto:unknown@mp2i-vms.fr")
organizer.params["cn"] = vText(str(rotation.creneau.colleur)) organizer.params["cn"] = vText(str(rotation.creneau.colleur))
@ -40,8 +71,8 @@ def to_calendar(etudiant, periode):
for e in rotation.groupe_effectif(): for e in rotation.groupe_effectif():
attendee = vCalAddress("mailto:unknown@mp2i-vms.fr") attendee = vCalAddress("mailto:unknown@mp2i-vms.fr")
attendee.params["cn"] = vText(str(e))
attendee.params["role"] = vText("Etudiant") attendee.params["role"] = vText("Etudiant")
attendee.params["cn"] = vText(str(e))
event.add("attendee", attendee, encode=0) event.add("attendee", attendee, encode=0)