respect RFC 5545 for ics export #1

Merged
valentin merged 1 commits from dev into main 2024-04-20 12:27:52 +02:00
1 changed files with 37 additions and 6 deletions
Showing only changes of commit 5fd334f7fa - Show all commits

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)