staticky-bot/create_calendar.py

185 lines
5.3 KiB
Python

import pandas
import datetime
import icalendar
from pathlib import Path
pd_eleves = pandas.read_csv('Resources/eleves.csv')
np_eleves = pd_eleves.to_numpy()
pd_colles = pandas.read_csv('Resources/colles.csv')
np_colles = pd_colles.to_numpy()
jour_to_delta = {
"lundi": 0,
"mardi": 1,
"mercredi": 2,
"jeudi": 3,
"vendredi": 4,
}
langues = ["Anglais", "Allemand", "Espagnol"]
option_langues = {
"EN": ["Anglais LV1"],
"EN-DE": ["Anglais LV1", "Allemand LV2"],
"EN-ES": ["Anglais LV1", "Espagnol LV2"],
"DE-EN": ["Allemand LV1", "Anglais LV2"],
"ES-EN": ["Espangol LV1", "Anglais LV2"]
}
def display(cal):
return cal.to_ical().decode("utf-8").replace('\r\n', '\n').strip()
def get_eleves():
"""
Renvoie la liste des eleves avec leur groupe associés à leur groupe, a utiliser dans la /cmd
"""
liste = {}
for row in np_eleves[1:]:
liste[f"{row[0]} {row[1]} - {row[2]}"] = row[2]
return liste
def debut_semaine_to_datetime(date_string: str) -> datetime.time:
"""
Transforme un string de debut de semaine au format dd/mm/yyyy en datetime.time
"""
return datetime.datetime.strptime(date_string, "%d/%m/%y")
def get_colles_groupe(np_colles, groupe, option_langue):
"""
Renvoie les colles pour un groupe sous la forme d'une liste d'évènements ICS
np_colles: l'array 2D numpy contenant le colloscope
groupe: str, le numéro du groupe
option_langue: str, les options de langue
"""
liste_colles = []
for row in np_colles[1:]:
if pandas.isnull(row[0]) or row[0] == "pas de colle":
# il n'y a pas de colle, on skip !
continue
# Si la colle n'est pas la LV1 de l'élève, on skip
if row[0] == "Anglais" and not option_langue.startswith("EN"):
continue
elif row[0] == "Allemand" and not option_langue.startswith("DE"):
continue
elif row[0] == "Espagnol" and not option_langue.startswith("ES"):
continue
for index, colle in enumerate(row[5:]):
# les quatre premières cases ne sont pas
if pandas.isnull(colle) or colle != groupe:
continue
new_colle = icalendar.Event()
new_colle.add("summary", f"Colle {row[0]}")
new_colle.add("description", f"{row[3]} {row[4]}")
date = debut_semaine_to_datetime(np_colles[0][index+5])
date += datetime.timedelta(days=jour_to_delta[row[1]])
date += datetime.timedelta(hours=int(row[2][:-1]))
new_colle.add("dtstart", date)
date += datetime.timedelta(hours=1)
new_colle.add("dtend", date)
liste_colles.append(new_colle)
return liste_colles
def get_cours_SI(np_colles, groupe):
"""
Renvoie les colles pour un groupe sous la forme d'une liste d'évènements ICS, cad
icalendar.Event
np_colles: l'array 2D numpy contenant le colloscope
groupe: str, le numéro du groupe
"""
liste_cours = []
for index, cell in enumerate(np_colles[-1][5:]):
heure = 17
groupes = cell.split("§")
if groupe in groupes or f"\n{groupe}" in groupes:
heure = 16
cours_si = icalendar.Event()
cours_si.add("summary", "TD SI")
cours_si.add("description", "M. Derumeaux R415")
date = debut_semaine_to_datetime(np_colles[0][index+5])
date += datetime.timedelta(days=jour_to_delta["mardi"])
date += datetime.timedelta(hours=heure)
cours_si.add("dtstart", date)
date += datetime.timedelta(hours=1)
cours_si.add("dtend", date)
liste_cours.append(cours_si)
return liste_cours
def get_langues(langues):
"""
Renvoie la liste de cours de langue associés
list[icalendar.Event]
"""
liste_langues = []
p = Path(__file__).with_name('Resources')
p = Path(p, f"EDT_Langues.ics")
with p.open('r') as f:
opened_cal = icalendar.Calendar.from_ical(f.read())
for event in opened_cal.walk("vevent"):
if event.get("summary") in option_langues[langues]:
liste_langues.append(event)
return liste_langues
def get_calendar(groupe, langues):
""""
Renvoie un calendrier (icalendar.Calendar) pour un groupe avec des langues donné
"""
moitie = None
for row in np_eleves[1:]:
if row[2] == int(groupe):
moitie = row[3]
break
new_cal = icalendar.Calendar()
p = Path(__file__).with_name('Resources')
p = Path(p, f"EDT_{moitie}.ics")
with p.open('r') as f:
opened_cal = icalendar.Calendar.from_ical(f.read())
for event in opened_cal.walk("vevent"):
new_cal.add_component(event)
p = Path(__file__).with_name('Resources')
p = Path(p, f"EDT_Base.ics")
with p.open('r') as f:
opened_cal = icalendar.Calendar.from_ical(f.read())
for event in opened_cal.walk("vevent"):
new_cal.add_component(event)
for event in get_langues(langues):
new_cal.add_component(event)
for event in get_cours_SI(np_colles, groupe):
new_cal.add_component(event)
for event in get_colles_groupe(np_colles, groupe, langues):
new_cal.add_component(event)
print(display(new_cal))
return new_cal.to_ical()