Changement de l'enregistrement des salles (dictionnaire 'rooms')

Diverses améliorations de lisibilité, des commentaires, des docstrings, ...
This commit is contained in:
antux18 2022-02-26 16:39:29 +01:00
parent f8ff4ee9f6
commit eaa21bea86
2 changed files with 53 additions and 26 deletions

View File

@ -24,7 +24,7 @@ import rooms_get as ro
# import definitions as lib # TODO : À quoi ça sert ? # import definitions as lib # TODO : À quoi ça sert ?
# Globales # Globales
favorites = ["C"+str(i)+" MATH" for i in range(1,10)]+["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é
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é
@ -60,7 +60,7 @@ def main() :
if room["free"] : if room["free"] :
deltasec = room["occupied_at"].timestamp() - date.timestamp() deltasec = room["occupied_at"].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) + ":" + str(room["occupied_at"].minute)) 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 ?)
# Salles libres prochainement : # Salles libres prochainement :
print("\nLes salles suivantes seront disponibles prochainement : \n") print("\nLes salles suivantes seront disponibles prochainement : \n")
@ -69,7 +69,7 @@ def main() :
if not room["free"] : if not room["free"] :
deltasec = room["free_at"].timestamp() - date.timestamp() deltasec = room["free_at"].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) + ":" + str(room["free_at"].minute)) 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 __name__=="__main__": if __name__=="__main__":
main() main()

View File

@ -30,10 +30,10 @@ def room(name, occupied_at, free_at):
---------- ----------
name : str name : str
Le nom de la salle. Le nom de la salle.
occupied_at : datetime.datetime occupied_at : datetime.datetime or None
La prochaine heure à laquelle elle est occupée. La prochaine heure à laquelle elle est occupée, ou None si salle déjà occupée.
free_at : datetime.datetime free_at : datetime.datetime or None
La prochaine heure à laquelle est est libre. La prochaine heure à laquelle est est libre, ou None, si elle est déjà libre.
Returns Returns
------- -------
@ -42,7 +42,12 @@ def room(name, occupied_at, free_at):
""" """
return {"name":name, "occupied_at":occupied_at, "free_at":free_at, "free":free_at.timestamp() > occupied_at.timestamp()} 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}
def sched_get(date, link=None) : def sched_get(date, link=None) :
@ -87,7 +92,7 @@ def sched_get(date, link=None) :
def getrooms(datet, links=[]) : def getrooms(datet, links=[]) :
""" """
Crée une liste de toute 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.
Parameters Parameters
---------- ----------
@ -97,7 +102,7 @@ def getrooms(datet, links=[]) :
Returns Returns
------- -------
total_rooms : dict total_rooms : dict
Dictionnaire des salles, indexée par leurs nom. Dictionnaire des salles, indexées par leur nom.
Toutes les salles mentionnées dans le fichier, avec des informations. Toutes les salles mentionnées dans le fichier, avec des informations.
""" """
@ -109,27 +114,49 @@ def getrooms(datet, links=[]) :
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
for cal in cals: for cal in cals : # Bâtiments
for comp in cal.walk(): for comp in cal.walk() : # Événements
if comp.name == "VEVENT" : if comp.name == "VEVENT" :
# Récupération des infos : # Récupération des infos :
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"))
# On ignore si c'est avant la date actuelle (avec une valeur loin dans le futur) # Soit l'événement se passe maintenant (salle occupée maintenant) :
if datestart.timestamp() < datet.timestamp(): if datestart.timestamp() <= datet.timestamp() and dateend.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 occupied_at = None
if dateend.timestamp() < datet.timestamp(): free_at = dateend
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 total_rooms[roomname] = room(roomname, occupied_at, free_at)
# Enregistrement dans le dictionnaire : # Soit l'événement se passe prochainement (salle occupée à l'occasion de cet événement) :
if roomname in total_rooms.keys(): elif datestart.timestamp() > datet.timestamp() :
if datestart.timestamp() > total_rooms[roomname]["occupied_at"].timestamp(): if roomname not in total_rooms.keys() :
datestart = total_rooms[roomname]["occupied_at"] occupied_at = datestart
if dateend.timestamp() > total_rooms[roomname]["free_at"].timestamp(): free_at = None
dateend = total_rooms[roomname]["free_at"] total_rooms[roomname] = room(roomname, occupied_at, free_at)
total_rooms[roomname] = room(roomname, datestart, dateend) 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
if datestart.timestamp() < total_rooms[roomname]["occupied_at"].timestamp() :
occupied_at = datestart
free_at = None
total_rooms[roomname] = room(roomname, occupied_at, free_at)
# 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)
# 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
# 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
# Enregistrement dans le dictionnaire :
# Plus nécessaire, car on ne s'occupe plus des événements passés :
# if roomname in total_rooms.keys() :
# if datestart.timestamp() > total_rooms[roomname]["occupied_at"].timestamp() :
# occupied_at = total_rooms[roomname]["occupied_at"]
# if dateend.timestamp() > total_rooms[roomname]["free_at"].timestamp() :
# free_at = total_rooms[roomname]["free_at"]
return total_rooms return total_rooms