colles.mp2i-vms.fr/colloscope/icalexport.py

62 lines
1.9 KiB
Python

from datetime import date, time, datetime, timedelta
from pytz import timezone
from uuid import uuid4
from os import path
from icalendar import Calendar, Event, vCalAddress, vText
from colloscope.models import *
LOCAL_TZ = "Europe/Paris"
def to_calendar(etudiant, periode):
p = path.abspath('./static/Base_Calendar.ics')
with open(p) as f:
cal = Calendar.from_ical(f.read())
rotations = Rotation.objects \
.filter(groupes__membres=etudiant) \
.select_related("creneau__periode__classe__lycee") \
.select_related("creneau__matiere") \
.select_related("creneau__colleur") \
for rotation in rotations:
event = Event()
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, 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("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")
event.add("organizer", organizer)
for e in rotation.groupe_effectif():
attendee = vCalAddress("mailto:unknown@mp2i-vms.fr")
attendee.params["role"] = vText("Etudiant")
attendee.params["cn"] = vText(str(e))
event.add("attendee", attendee, encode=0)
cal.add_component(event)
return cal