This commit is contained in:
Antoine Waehren 2022-03-03 09:55:03 +01:00
commit f3cbd129e3
2 changed files with 39 additions and 46 deletions

View File

@ -25,6 +25,7 @@ import rooms_get as ro
# Globales # Globales
favorites = ["C" + str(i) + " MATH" for i in range(1,12)] + ["C42-CMI"] # TODO : Ne sera pas conservé favorites = ["C" + str(i) + " MATH" for i in range(1,12)] + ["C42-CMI"] # TODO : Ne sera pas conservé
favorites = []
links = [] # Liens vers les calendriers des salles des différents bâtiments de l'université links = [] # Liens vers les calendriers des salles des différents bâtiments de l'université

View File

@ -46,7 +46,7 @@ def room(name, start, end, is_free):
Un dictionnaire contenant ces 4 informations, avec le même nom en clef. Un dictionnaire contenant ces 4 informations, avec le même nom en clef.
""" """
# return {"name":name, "occupied_at":occupied_at, "free_at":free_at, "free":free_at.timestamp() > occupied_at.timestamp()} # return {"name":name, "occupied_at":occupied_at, "free_at":free_at, "free":free_at.timestamp() > occupied_at.timestamp()}
return {"name":name, "start":start, "end":end, "is_free":is_free} return {"name":name, "start":start, "end":end, "is_free":is_free}
@ -86,31 +86,31 @@ def sched_get(date, enddate = None, link = None) :
day1 = str(date.day) day1 = str(date.day)
month1 = str(date.month) month1 = str(date.month)
year1 = str(date.year) year1 = str(date.year)
finallink = link.replace("$DAY1$", day1) finallink = link.replace("$DAY1$", day1)
finallink = finallink.replace("$MONTH1$", month1) finallink = finallink.replace("$MONTH1$", month1)
finallink = finallink.replace("$YEAR1$", year1) finallink = finallink.replace("$YEAR1$", year1)
if enddate != None : if enddate != None :
day2 = str(enddate.day) day2 = str(enddate.day)
month2 = str(enddate.month) month2 = str(enddate.month)
year2 = str(enddate.year) year2 = str(enddate.year)
finallink = finallink.replace("$DAY2$", day2) finallink = finallink.replace("$DAY2$", day2)
finallink = finallink.replace("$MONTH2$", month2) finallink = finallink.replace("$MONTH2$", month2)
finallink = finallink.replace("$YEAR2$", year2) finallink = finallink.replace("$YEAR2$", year2)
else : else :
finallink = finallink.replace("$DAY2$", day1) finallink = finallink.replace("$DAY2$", day1)
finallink = finallink.replace("$MONTH2$", month1) finallink = finallink.replace("$MONTH2$", month1)
finallink = finallink.replace("$YEAR2$", year1) finallink = finallink.replace("$YEAR2$", year1)
r = requests.get(finallink) r = requests.get(finallink)
return r.content return r.content
def getrooms(datet, links=[]) : def getrooms(datet, links=[],min_occur=3) :
""" """
Crée une liste de toutes les salles, avec des informations si elles sont libres ou non. Crée une liste de toutes les salles, avec des informations si elles sont libres ou non.
@ -118,6 +118,12 @@ def getrooms(datet, links=[]) :
---------- ----------
datet : datetime.datetime() datet : datetime.datetime()
Date au format datetime. Date au format datetime.
Optionnels:
links : list, par défaut vide
liste des liens à consulter ( si est vide, ping l'ufr )
min_occur : nombre, par défaut à 3
Nombre minimum de fois qu'une salle doit être mentionnée pour être comptée
( permet d'éviter le flood de salles qui n'existe que pour les évals )
Returns Returns
------- -------
@ -134,38 +140,17 @@ def getrooms(datet, links=[]) :
cals = [icalendar.Calendar.from_ical(sched_get(datet))] cals = [icalendar.Calendar.from_ical(sched_get(datet))]
total_rooms = {} total_rooms = {}
rooms_count = {}
# default_hour_margin = 2 # default_hour_margin = 2
# Création du dico de toutes les salles (récupération de l'emploi du temps de l'année entière, pour être sûr d'obtenir toutes les salles disponibles): margintime = datetime.timedelta(weeks=4)
if datet.month >= 9 : # Si on est au début de l'année scolaire (par ex : en 2021, si l'année scolaire est 2021-2022)
year1 = datet.year # Année civile de début de l'année scolaire
year2 = datet.year + 1 # Année civile de fin de l'année scolaire
else :
year1 = datet.year - 1
year2 = datet.year
date1 = datetime.datetime(year1, 9, 1)
date2 = datetime.datetime(year2, 8, 1)
# Création du calendrier de l'année scolaire :
# On vérifie si le fichier existe :
if not os.path.exists("data/schedule" + str(year1) + "-" + str(year2) + ".ics") :
# On télécharge l'emploi du temps de l'année scolaire, s'il n'existe pas :
year_cal_file = open("data/schedule" + str(year1) + "-" + str(year2) + ".ics", "w")
year_cal = sched_get(date1, date2, links)
year_cal_file.writelines(year_cal.decode("utf-8"))
year_cal_file.close()
year_cal_file = open("data/schedule" + str(year1) + "-" + str(year2) + ".ics", "rb")
year_cals = [] year_cals = []
for i in links : for i in links : # Choper les liens mentionné, sur une période de quatres mois
year_cals.append(icalendar.Calendar.from_ical(year_cal_file.read(), link = i)) result = sched_get(datet, datet+margintime, links)
year_cals.append(icalendar.Calendar.from_ical(result))
if len(links) == 0 : # Par défaut, ne mets pas de lien, ce qui retourne celui de l'UFR if len(links) == 0 : # Par défaut, ne mets pas de lien, ce qui retourne celui de l'UFR
year_cals = [icalendar.Calendar.from_ical(year_cal_file.read())] year_cals = [icalendar.Calendar.from_ical(sched_get(datet,datet+margintime))]
# Ajout de toutes les salles contenues dans le calendrier de l'année scolaire : # Ajout de toutes les salles contenues dans le calendrier de l'année scolaire :
for cal in year_cals : # Bâtiments for cal in year_cals : # Bâtiments
for comp in cal.walk() : # Événements for comp in cal.walk() : # Événements
@ -177,7 +162,10 @@ def getrooms(datet, links=[]) :
end = datet.replace(hour = 23, minute = 59, second = 59) # Par défaut, l'heure de fin de la prochaine période disponibilité est aujourd'hui à 23:59 end = datet.replace(hour = 23, minute = 59, second = 59) # Par défaut, l'heure de fin de la prochaine période disponibilité est aujourd'hui à 23:59
is_free = True # Par défaut, la salle est libre is_free = True # Par défaut, la salle est libre
total_rooms[roomname] = room(roomname, start, end, is_free) total_rooms[roomname] = room(roomname, start, end, is_free)
rooms_count[roomname] = 1
else:
rooms_count[roomname]+=1
# Ajout des infos supplémentaires sur les salles (heures de début-fin de dispo, indicateur de dispo), s'il y en a : # Ajout des infos supplémentaires sur les salles (heures de début-fin de dispo, indicateur de dispo), s'il y en a :
# Première boucle, pour déterminer les salles occupées : # Première boucle, pour déterminer les salles occupées :
for cal in cals : # Bâtiments for cal in cals : # Bâtiments
@ -187,14 +175,14 @@ def getrooms(datet, links=[]) :
datestart = comp.decoded("dtstart") datestart = comp.decoded("dtstart")
dateend = comp.decoded("dtend") dateend = comp.decoded("dtend")
roomname = str(comp.get("location")) roomname = str(comp.get("location"))
# L'événement se passe maintenant (salle occupée maintenant) : # L'événement se passe maintenant (salle occupée maintenant) :
if datestart.timestamp() <= datet.timestamp() and dateend.timestamp() > datet.timestamp() : if datestart.timestamp() <= datet.timestamp() and dateend.timestamp() > datet.timestamp() :
start = dateend # L'heure de début de la prochaine période de disponibilité est la fin de l'événement start = dateend # L'heure de début de la prochaine période de disponibilité est la fin de l'événement
end = datet.replace(hour = 23, minute = 59, second = 59) # Par défaut, l'heure de fin de la prochaine période disponibilité est aujourd'hui à 23:59 end = datet.replace(hour = 23, minute = 59, second = 59) # Par défaut, l'heure de fin de la prochaine période disponibilité est aujourd'hui à 23:59
is_free = False is_free = False
total_rooms[roomname] = room(roomname, start, end, is_free) total_rooms[roomname] = room(roomname, start, end, is_free)
# Deuxième boucle, pour ajouter les heures de dispos des salles : # Deuxième boucle, pour ajouter les heures de dispos des salles :
for cal in cals : # Bâtiments for cal in cals : # Bâtiments
for comp in cal.walk() : # Événements for comp in cal.walk() : # Événements
@ -203,7 +191,7 @@ def getrooms(datet, links=[]) :
datestart = comp.decoded("dtstart") datestart = comp.decoded("dtstart")
dateend = comp.decoded("dtend") dateend = comp.decoded("dtend")
roomname = str(comp.get("location")) roomname = str(comp.get("location"))
# L'événement se passe prochainement (salle occupée à l'occasion de cet événement) : # L'événement se passe prochainement (salle occupée à l'occasion de cet événement) :
if datestart.timestamp() > datet.timestamp() : if datestart.timestamp() > datet.timestamp() :
if roomname not in total_rooms.keys() : if roomname not in total_rooms.keys() :
@ -221,23 +209,27 @@ def getrooms(datet, links=[]) :
end = datestart end = datestart
is_free = total_rooms[roomname]["is_free"] is_free = total_rooms[roomname]["is_free"]
total_rooms[roomname] = room(roomname, start, end, is_free) total_rooms[roomname] = room(roomname, start, end, is_free)
# Dans les autres cas, l'événement est passé, donc on l'ignore et on passe au suivant. # Dans les autres cas, l'événement est passé, donc on l'ignore et on passe au suivant.
# # On ignore si c'est avant la date actuelle (avec une valeur loin dans le futur) # # On ignore si c'est avant la date actuelle (avec une valeur loin dans le futur)
# if datestart.timestamp() < datet.timestamp() : # if datestart.timestamp() < datet.timestamp() :
# datestart = datet + datetime.timedelta(hours = default_hour_margin) # Par défaut, si il n'y a rien de précisé pour sa prochaine occupation, elle sera occupée dans 1 ans # datestart = datet + datetime.timedelta(hours = default_hour_margin) # Par défaut, si il n'y a rien de précisé pour sa prochaine occupation, elle sera occupée dans 1 ans
# if dateend.timestamp() < datet.timestamp() : # if dateend.timestamp() < datet.timestamp() :
# dateend = datestart + datetime.timedelta(hours = default_hour_margin) # Par défaut, si il n'y a rien de précisé pour sa prochaine occupation, elle sera occupée dans 1 an après son occupation # dateend = datestart + datetime.timedelta(hours = default_hour_margin) # Par défaut, si il n'y a rien de précisé pour sa prochaine occupation, elle sera occupée dans 1 an après son occupation
# Enregistrement dans le dictionnaire : # Enregistrement dans le dictionnaire :
# Plus nécessaire, car on ne s'occupe plus des événements passés : # Plus nécessaire, car on ne s'occupe plus des événements passés :
# if roomname in total_rooms.keys() : # if roomname in total_rooms.keys() :
# if datestart.timestamp() > total_rooms[roomname]["occupied_at"].timestamp() : # if datestart.timestamp() > total_rooms[roomname]["occupied_at"].timestamp() :
# occupied_at = total_rooms[roomname]["occupied_at"] # occupied_at = total_rooms[roomname]["occupied_at"]
# if dateend.timestamp() > total_rooms[roomname]["free_at"].timestamp() : # if dateend.timestamp() > total_rooms[roomname]["free_at"].timestamp() :
# free_at = total_rooms[roomname]["free_at"] # free_at = total_rooms[roomname]["free_at"]
# Filtrer les salles qui ne sont mentionnées qu'un certain nombre de fois
# Et qui n'on pas de virgule dans le nom
for roomname in rooms_count.keys():
if rooms_count[roomname]<min_occur or "," in roomname:
del(total_rooms[roomname])
return total_rooms return total_rooms