Merge pull request 'respect RFC 5545 for ics export' (#1) from dev into main

Reviewed-on: sl_game_studio/kholles-web#1
This commit is contained in:
Valentin Moguérou 2024-04-20 12:27:51 +02:00
commit 6332e083c1
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)