Ajout de mon prototype d'interface pour l'application mobile.

Suppression de l'import de 'definitions' dans 'main_cli'
Modification de l'affichage de la prochaine occupation de la salle, ou de la prochaine libération : affichage de l'heure précise plutôt que du temps en minutes restant
Diverses améliorations de lisibilité du code, des commentaires, des docstrings...
This commit is contained in:
antux18 2022-02-26 15:26:34 +01:00
parent 3ea9ea0621
commit f8ff4ee9f6
4 changed files with 69 additions and 53 deletions

View File

@ -21,7 +21,7 @@ import datetime
# Fonctions :
def is_bissextile(year) :
def bissextile(year) :
"""
Indique si l'année 'year' est bissextile ou non.
@ -84,7 +84,7 @@ def date_input() :
month = 0
while month not in range(1, 13) :
month = int(input("Entrer le mois.\n"))
month = int(input("Entrer le mois.\n> "))
mdays = month_days(month, year)
day = 0

View File

@ -21,11 +21,11 @@ import datetime
# Fichiers locaux :
import date_tools
import rooms_get as ro
import definitions as lib
# import definitions as lib # TODO : À quoi ça sert ?
# Globales
favorites = ["C"+str(i)+" MATH" for i in range(1,10)]+["C42-CMI"]
links = []
favorites = ["C"+str(i)+" MATH" for i in range(1,10)]+["C42-CMI"] # TODO : Ne sera pas conservé
links = [] # Liens vers les calendriers des salles des différents bâtiments de l'université
# Fonctions :
@ -47,24 +47,29 @@ def main() :
while date_choice not in (1,2) :
date_choice = int(input("Souhaitez-vous afficher les salles disponibles maintenant (1), où à une date précise (2) ?\n> "))
if date_choice == 1 :
if date_choice == 1 : # Heure système
date = datetime.datetime.today()
else :
else : # Heure mannuelle
date = date_tools.date_input()
available_rooms = ro.getrooms(date,links=links)
print("Les salles suivantes sont disponibles à " + str(date.hour) + ":" + str(date.minute) + ", le " + str(date.day) + " :\n")
# Salles libres à la date indiquée :
print("\nLes salles suivantes sont disponibles à " + str(date.hour) + ":" + str(date.minute) + ", le " + str(date.date()) + " :\n")
for room in available_rooms.values() :
if room["name"] in favorites or len(favorites)==0:
if room["free"]:
deltasec = room["occupied_at"].timestamp()-date.timestamp()
print(" - " + room["name"]+" | occuppée dans : "+str(int(deltasec/60+0.5))+" minutes")
print("\nVoici celles occupées : \n")
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"] :
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 à : " + str(room["occupied_at"].hour) + ":" + str(room["occupied_at"].minute))
# Salles libres prochainement :
print("\nLes salles suivantes seront disponibles prochainement : \n")
for room in available_rooms.values() :
if room["name"] in favorites or len(favorites)==0:
if not room["free"]:
deltasec = room["free_at"].timestamp()-date.timestamp()
print(" - " + room["name"]+" | libre dans : "+str(int(deltasec/60+0.5))+" minutes")
if room["name"] in favorites or len(favorites) == 0 :
if not room["free"] :
deltasec = room["free_at"].timestamp() - date.timestamp()
# 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))
if __name__=="__main__":
main()

Binary file not shown.

View File

@ -22,22 +22,30 @@ import datetime
# Fonctions :
def room(name,occupied_at,free_at):
def room(name, occupied_at, free_at):
"""
Retourne un dico contenant le nom, la prochaine date à laquelle elle est occupée, ainsi que la prochaine date à laquelle elle est libre
Arguments :
name : String
Le nom de la salle
occupied_at : datetime.datetime
La prochaine heure à laquelle elle est occupée
free_at : datetime.datetime
La prochaine heure à laquelle est est libre
Retourne:
Un dico contenant ces trois informations, avec le même nom en clef, en plus de si elle est actuellement libre
"""
return {"name":name,"occupied_at":occupied_at,"free_at":free_at,"free":free_at.timestamp()>occupied_at.timestamp()}
Retourne un dictionnaire contenant le nom, la prochaine date à laquelle elle est occupée, ainsi que la prochaine date à laquelle elle est libre
def sched_get(date,link=None) :
Parameters
----------
name : str
Le nom de la salle.
occupied_at : datetime.datetime
La prochaine heure à laquelle elle est occupée.
free_at : datetime.datetime
La prochaine heure à laquelle est est libre.
Returns
-------
dict
Un dictionnaire contenant ces trois informations, avec le même nom en clef, en plus de si elle est actuellement libre.
"""
return {"name":name, "occupied_at":occupied_at, "free_at":free_at, "free":free_at.timestamp() > occupied_at.timestamp()}
def sched_get(date, link=None) :
"""
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.
@ -49,15 +57,16 @@ def sched_get(date,link=None) :
Optionnels:
link:
Un lien vers lequel effectuer la recherche, des informations seront remplacées:
$YEAR$ l'année
$MONTH$ le mois
$DAY$ le jour
Par défaut, sera un lien des salles de l'UFR
Un lien vers lequel effectuer la recherche, des informations seront remplacées :
$YEAR$ : l'année
$MONTH$ : le mois
$DAY$ : le jour
Par défaut, sera un lien des salles de l'UFR.
Returns
-------
Le texte du résultat de la requête.
bytes
Le texte du résultat de la requête.
"""
@ -75,9 +84,10 @@ def sched_get(date,link=None) :
return r.content
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 toute les salles, avec des informations si elles sont libres ou non.
Parameters
----------
@ -86,16 +96,16 @@ def getrooms(datet,links=[]) :
Returns
-------
total_rooms : dico
Dico des salles, indexée par leurs nom.
Toutes les salles mentionnées dans le fichier, avec des informations
total_rooms : dict
Dictionnaire des salles, indexée par leurs nom.
Toutes les salles mentionnées dans le fichier, avec des informations.
"""
# Récupération des informations sur l'EDT téléchargé :
cals = []
for i in links:
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
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
cals = [icalendar.Calendar.from_ical(sched_get(datet))]
total_rooms = {}
@ -103,22 +113,23 @@ def getrooms(datet,links=[]) :
for cal in cals:
for comp in cal.walk():
if comp.name == "VEVENT" :
# Récupération des infos
# Récupération des infos :
datestart = comp.decoded("dtstart")
dateend = comp.decoded("dtend")
roomname = str(comp.get("location"))
# 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
# 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
# J'enregistre dans le dico
# Enregistrement dans le dictionnaire :
if roomname in total_rooms.keys():
if datestart.timestamp() > total_rooms[roomname]["occupied_at"].timestamp():
datestart = total_rooms[roomname]["occupied_at"]
if dateend.timestamp() > total_rooms[roomname]["free_at"].timestamp():
dateend= total_rooms[roomname]["free_at"]
total_rooms[roomname] = room(roomname,datestart,dateend)
dateend = total_rooms[roomname]["free_at"]
total_rooms[roomname] = room(roomname, datestart, dateend)
return total_rooms