from datetime import date, time, datetime, timedelta from pytz import timezone from icalendar import Calendar, Event, vCalAddress, vText from colloscope.models import * def emailize(nom, prenom=None): if prenom is not None: return "{}.{}@example.com" \ .format( prenom.replace(" ", "_").lower(), nom.replace(" ", "_").lower() ) else: return "{}@example.com" \ .format(nom.replace(" ", "_").lower()) def to_calendar(etudiant, periode): cal = Calendar() cal.add("prodid", "-//Colloscope//colles.mp2i-vms.fr//") cal.add("version", "2.0") 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() event.add("name", "Colle") event.add("summary", str(rotation)) start = rotation.datetime() fin = start + rotation.creneau.duree event.add("dtstart", start) event.add("dtend", fin) event.add("dtstamp", datetime.now()) event.add("location", f"{rotation.creneau.salle} ({rotation.creneau.periode.classe.lycee})") event.add("matiere", str(rotation.creneau.matiere)) organizer = vCalAddress(f"mailto:{emailize(rotation.creneau.colleur.nom)}") 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:{emailize(e.nom, prenom=e.prenom)}") attendee.params["cn"] = vText(str(e)) attendee.params["role"] = vText("Etudiant") event.add("attendee", attendee, encode=0) cal.add_component(event) return cal