Amélioration du stockage des informations des salles dans leur dictionnaire.

Amélioration de l'affichage des salles dispos ou bientôt dispos + ajout d'informations supplémentaires.
This commit is contained in:
antux18 2022-02-26 19:33:53 +01:00
parent eaa21bea86
commit 8cad733b04
2 changed files with 105 additions and 41 deletions

View File

@ -57,19 +57,25 @@ def main() :
print("\nLes salles suivantes sont disponibles à " + str(date.hour) + ":" + str(date.minute) + ", le " + str(date.date()) + " :\n") print("\nLes salles suivantes sont disponibles à " + str(date.hour) + ":" + str(date.minute) + ", le " + str(date.date()) + " :\n")
for room in available_rooms.values() : for room in available_rooms.values() :
if room["name"] in favorites or len(favorites) == 0 : # TODO : Changer le comportement de ce 'if' : il faudrait afficher toutes les salles, mais d'abord les favorites if room["name"] in favorites or len(favorites) == 0 : # TODO : Changer le comportement de ce 'if' : il faudrait afficher toutes les salles, mais d'abord les favorites
if room["free"] : if room["is_free"] :
deltasec = room["occupied_at"].timestamp() - date.timestamp() deltasec = room["end"].timestamp() - date.timestamp()
# print(" - " + room["name"]+" | occupée dans : "+str(int(deltasec/60+0.5))+" minutes") # print(" - " + room["name"]+" | occupée dans : "+str(int(deltasec/60+0.5))+" minutes")
print(" - " + room["name"] + " | occupée à : " + str(room["occupied_at"].hour + 1) + ":" + str(room["occupied_at"].minute) + " (dans " + str(int(deltasec/60+0.5 + 60)) + " minutes)") # TODO : Obligé d'ajouter 1 heure (problème de fuseau horaire ?) if room["end"].hour == 23 and room["end"].minute == 59 :
print(" - " + room["name"]) # TODO : Obligé d'ajouter 1 heure (problème de fuseau horaire ?)
else :
print(" - " + room["name"] + " | occupée à : " + str(room["end"].hour + 1) + ":" + str(room["end"].minute) + " (dans " + str(int(deltasec/60+0.5 + 60)) + " minutes)")
# Salles libres prochainement : # Salles libres prochainement :
print("\nLes salles suivantes seront disponibles prochainement : \n") print("\nLes salles suivantes seront disponibles prochainement : \n")
for room in available_rooms.values() : for room in available_rooms.values() :
if room["name"] in favorites or len(favorites) == 0 : if room["name"] in favorites or len(favorites) == 0 :
if not room["free"] : if not room["is_free"] :
deltasec = room["free_at"].timestamp() - date.timestamp() deltasec = room["start"].timestamp() - date.timestamp()
# print(" - " + room["name"]+" | libre dans : "+str(int(deltasec/60+0.5))+" minutes") # print(" - " + room["name"]+" | libre dans : "+str(int(deltasec/60+0.5))+" minutes")
print(" - " + room["name"] + " | libre à : " + str(room["free_at"].hour + 1) + ":" + str(room["free_at"].minute) + " (dans " + str(int(deltasec/60+0.5) + 60) + " minutes)") # TODO : Obligé d'ajouter 1 heure (problème de fuseau horaire ?) if room["end"].hour == 23 and room["end"].minute == 59 :
print(" - " + room["name"] + " | libre à " + str(room["start"].hour + 1) + ":" + str(room["start"].minute) + " (dans " + str(int(deltasec/60+0.5) + 60) + " minutes)") # TODO : Obligé d'ajouter 1 heure (problème de fuseau horaire ?)
else :
print(" - " + room["name"] + " | libre de " + str(room["start"].hour + 1) + ":" + str(room["start"].minute) + " à " + str(room["end"].hour + 1) + ":" + str(room["end"].minute) + " (dans " + str(int(deltasec/60+0.5) + 60) + " minutes)") # TODO : Obligé d'ajouter 1 heure (problème de fuseau horaire ?)
if __name__=="__main__": if __name__=="__main__":
main() main()

View File

@ -22,35 +22,35 @@ import datetime
# Fonctions : # Fonctions :
def room(name, occupied_at, free_at): def room(name, start, end, is_free):
""" """
Retourne un dictionnaire contenant le nom, la prochaine date à laquelle elle est occupée, ainsi que la prochaine date à laquelle elle est libre Retourne un dictionnaire contenant le nom, la prochaine date à laquelle elle est occupée, ainsi que la prochaine date à laquelle elle est libre.
Parameters Parameters
---------- ----------
name : str name : str
Le nom de la salle. Le nom de la salle.
occupied_at : datetime.datetime or None start : datetime.datetime
La prochaine heure à laquelle elle est occupée, ou None si salle déjà occupée. Salle occupée : heure de début de la prochaine période de disponibilité.
free_at : datetime.datetime or None Salle libre : inutilisé (vaut la date du jour à 00:00).
La prochaine heure à laquelle est est libre, ou None, si elle est déjà libre. end : datetime.datetime
Salle occupée : heure de fin de la prochaine période de disponibilité.
Salle libre : heure de fin de disponibilité.
is_free : bool
Indique si la salle est libre ('True') ou non ('False')
Returns Returns
------- -------
dict dict
Un dictionnaire contenant ces trois informations, avec le même nom en clef, en plus de si elle est actuellement libre. Un dictionnaire contenant ces 4 informations, avec le même nom en clef.
""" """
free = False # Indique si la salle est libre ou non
if free_at == None :
free = True
# 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, "occupied_at":occupied_at, "free_at":free_at, "free":free} return {"name":name, "start":start, "end":end, "is_free":is_free}
def sched_get(date, link=None) : def sched_get(date, enddate = None, link = None) :
""" """
Récupère l'emploi du temps de toutes les salles (pour le moment, juste Récupère l'emploi du temps de toutes les salles (pour le moment, juste
de l'UFR) sur ADE depuis le site de l'Unistra. de l'UFR) sur ADE depuis le site de l'Unistra.
@ -58,7 +58,8 @@ def sched_get(date, link=None) :
Parameters Parameters
---------- ----------
date : datetime.datetime() date : datetime.datetime()
Date au format datetime. Date du calendrier à télécharger (date de début si une date de fin
'enddate' est indiquée).
Optionnels: Optionnels:
link: link:
@ -67,6 +68,9 @@ def sched_get(date, link=None) :
$MONTH$ : le mois $MONTH$ : le mois
$DAY$ : le jour $DAY$ : le jour
Par défaut, sera un lien des salles de l'UFR. Par défaut, sera un lien des salles de l'UFR.
enddate : datetime.datetime()
Date de fin du calendrier à télécharger (par défaut, il s'agit de
la date de début).
Returns Returns
------- -------
@ -76,15 +80,30 @@ def sched_get(date, link=None) :
""" """
if not link: if not link:
link = "https://adecons.unistra.fr/jsp/custom/modules/plannings/anonymous_cal.jsp?resources=30626&projectId=8&calType=ical&firstDate=$YEAR$-$MONTH$-$DAY$&lastDate=$YEAR$-$MONTH$-$DAY$" link = "https://adecons.unistra.fr/jsp/custom/modules/plannings/anonymous_cal.jsp?resources=30626&projectId=8&calType=ical&firstDate=$YEAR1$-$MONTH1$-$DAY1$&lastDate=$YEAR2$-$MONTH2$-$DAY2$"
day = str(date.day) day1 = str(date.day)
month = str(date.month) month1 = str(date.month)
year = str(date.year) year1 = str(date.year)
finallink = link.replace("$DAY$",day) finallink = link.replace("$DAY1$", day1)
finallink = finallink.replace("$MONTH$",month) finallink = finallink.replace("$MONTH1$", month1)
finallink = finallink.replace("$YEAR$",year) finallink = finallink.replace("$YEAR1$", year1)
if enddate != None :
day2 = str(enddate.day)
month2 = str(enddate.month)
year2 = str(enddate.year)
finallink = finallink.replace("$DAY2$", day2)
finallink = finallink.replace("$MONTH2$", month2)
finallink = finallink.replace("$YEAR2$", year2)
else :
finallink = finallink.replace("$DAY2$", day1)
finallink = finallink.replace("$MONTH2$", month1)
finallink = finallink.replace("$YEAR2$", year1)
r = requests.get(finallink) r = requests.get(finallink)
return r.content return r.content
@ -108,13 +127,46 @@ def getrooms(datet, links=[]) :
# Récupération des informations sur l'EDT téléchargé : # Récupération des informations sur l'EDT téléchargé :
cals = [] cals = []
for i in links: for i in links :
cals.append(icalendar.Calendar.from_ical(sched_get(datet), link = i)) cals.append(icalendar.Calendar.from_ical(sched_get(datet), link = i))
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
cals = [icalendar.Calendar.from_ical(sched_get(datet))] cals = [icalendar.Calendar.from_ical(sched_get(datet))]
total_rooms = {} total_rooms = {}
# 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):
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 :
year_cals = []
for i in links :
year_cals.append(icalendar.Calendar.from_ical(sched_get(date1, date2, links), link = i))
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(sched_get(date1, date2, links))]
# Ajout de toutes les salles contenues dans le calendrier de l'année scolaire :
for cal in year_cals : # Bâtiments
for comp in cal.walk() : # Événements
if comp.name == "VEVENT" :
# Ajout de la salle dans le dictionnaire, si elle n'y est pas :
roomname = str(comp.get("location"))
if roomname not in total_rooms.keys() :
start = datet.replace(hour = 0, minute = 0, second=0) # Par défaut, l'heure de début de disponibilité est aujourd'hui à 00:00
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
total_rooms[roomname] = room(roomname, start, end, is_free)
# Ajout des infos supplémentaires sur les salles (heures de début-fin de dispo, indicateur de dispo), s'il y en a :
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
if comp.name == "VEVENT" : if comp.name == "VEVENT" :
@ -125,21 +177,27 @@ def getrooms(datet, links=[]) :
# Soit l'événement se passe maintenant (salle occupée maintenant) : # Soit 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() :
occupied_at = None start = dateend # L'heure de début de la prochaine période de disponibilité est la fin de l'événement
free_at = dateend if roomname not in total_rooms.keys() :
total_rooms[roomname] = room(roomname, occupied_at, free_at) 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
else :
end = total_rooms[roomname]["end"]
is_free = False
total_rooms[roomname] = room(roomname, start, end, is_free)
# Soit l'événement se passe prochainement (salle occupée à l'occasion de cet événement) : # Soit l'événement se passe prochainement (salle occupée à l'occasion de cet événement) :
elif datestart.timestamp() > datet.timestamp() : elif datestart.timestamp() > datet.timestamp() :
if roomname not in total_rooms.keys() : if roomname not in total_rooms.keys() :
occupied_at = datestart # On suppose d'abord que la salle est libre maintenant :
free_at = None start = datet.replace(hour = 0, minute = 0, second=0) # Par défaut, l'heure de début de disponibilité est aujourd'hui à 00:00
total_rooms[roomname] = room(roomname, occupied_at, free_at) end = datestart # L'heure de fin de disponibilité est le début de l'événement
elif total_rooms[roomname]["occupied_at"] != None : # Dans ce cas, il n'y a pas d'événement en cours, donc la salle est libre maintenant is_free = True
if datestart.timestamp() < total_rooms[roomname]["occupied_at"].timestamp() : total_rooms[roomname] = room(roomname, start, end, is_free)
occupied_at = datestart elif datestart.timestamp() < total_rooms[roomname]["end"].timestamp() :
free_at = None start = total_rooms[roomname]["start"]
total_rooms[roomname] = room(roomname, occupied_at, free_at) end = datestart
is_free = total_rooms[roomname]["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.