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:
parent
eaa21bea86
commit
8cad733b04
18
main_cli.py
18
main_cli.py
@ -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()
|
||||||
|
128
rooms_get.py
128
rooms_get.py
@ -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.
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user