From f8ff4ee9f6a8290808a28ab56757c0c000731e54 Mon Sep 17 00:00:00 2001 From: antux18 Date: Sat, 26 Feb 2022 15:26:34 +0100 Subject: [PATCH] =?UTF-8?q?Ajout=20de=20mon=20prototype=20d'interface=20po?= =?UTF-8?q?ur=20l'application=20mobile.=20Suppression=20de=20l'import=20de?= =?UTF-8?q?=20'definitions'=20dans=20'main=5Fcli'=20Modification=20de=20l'?= =?UTF-8?q?affichage=20de=20la=20prochaine=20occupation=20de=20la=20salle,?= =?UTF-8?q?=20ou=20de=20la=20prochaine=20lib=C3=A9ration=20:=20affichage?= =?UTF-8?q?=20de=20l'heure=20pr=C3=A9cise=20plut=C3=B4t=20que=20du=20temps?= =?UTF-8?q?=20en=20minutes=20restant=20Diverses=20am=C3=A9liorations=20de?= =?UTF-8?q?=20lisibilit=C3=A9=20du=20code,=20des=20commentaires,=20des=20d?= =?UTF-8?q?ocstrings...?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- date_tools.py | 4 +- main_cli.py | 35 ++++---- .../interface/Schéma interface (Antoine).odg | Bin 0 -> 29899 bytes rooms_get.py | 83 ++++++++++-------- 4 files changed, 69 insertions(+), 53 deletions(-) create mode 100644 prototypes/interface/Schéma interface (Antoine).odg diff --git a/date_tools.py b/date_tools.py index 282e9cf..6689409 100644 --- a/date_tools.py +++ b/date_tools.py @@ -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 diff --git a/main_cli.py b/main_cli.py index 621364a..30fde6a 100644 --- a/main_cli.py +++ b/main_cli.py @@ -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() diff --git a/prototypes/interface/Schéma interface (Antoine).odg b/prototypes/interface/Schéma interface (Antoine).odg new file mode 100644 index 0000000000000000000000000000000000000000..886202e0d1d8be002bb6586a562a4c8f0bb96b1b GIT binary patch literal 29899 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
    fpzr*6c;JEyU zo#8(t{b$bd{|nMz?G67K=a<3Z?^ymXIRBsB;Xi}@XZEn5{{Le7Py54vBmLP`{M8fY zml)OWPy!?UwnO~03ICbyuab_x9AkdRTh#yXkNJDTze;EQQhfX!GnD_S|M+Lhf0EYv zoiZOR!}U)>TYsYbdE?Qg?1L)sV{k0GH)ua9nD(8RbU)2<0!3tpz S5E$Tt8Qew3f+f8mApRf0@^O9u literal 0 HcmV?d00001 diff --git a/rooms_get.py b/rooms_get.py index af9497d..0082e38 100644 --- a/rooms_get.py +++ b/rooms_get.py @@ -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() 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