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) \ .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