61 lines
2.0 KiB
Python
61 lines
2.0 KiB
Python
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
|