From 8bf1b698b89e1a0526f13e63b82e749f45d65e89 Mon Sep 17 00:00:00 2001 From: "theo@manjaro" Date: Fri, 25 Feb 2022 10:51:34 +0100 Subject: [PATCH] =?UTF-8?q?Les=20salles=20enregistrent=20maintenant=20la?= =?UTF-8?q?=20prochaine=20fois=20qu'elle=20seront=20libre/occup=C3=A9es?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- main_cli.py | 7 ++-- rooms_get.py | 109 ++++++++++++++++++++------------------------------- 2 files changed, 46 insertions(+), 70 deletions(-) diff --git a/main_cli.py b/main_cli.py index f817e90..e311bbc 100644 --- a/main_cli.py +++ b/main_cli.py @@ -48,8 +48,9 @@ def main() : else : date = date_tools.date_input() - available_rooms = lib.intersection(ro.free_at(date),ro.free_at(date+datetime.timedelta(minutes=30))) + available_rooms = ro.getrooms(date) print("Les salles suivantes sont disponibles à " + str(date.hour) + ":" + str(date.minute) + ", le " + str(date.day) + " :\n") - for room in available_rooms : - print(" - " + room) + for room in available_rooms.values() : + if room["free"]: + print(" - " + room["name"]) diff --git a/rooms_get.py b/rooms_get.py index 63af337..48de877 100644 --- a/rooms_get.py +++ b/rooms_get.py @@ -19,12 +19,25 @@ Created on Thu Feb 24 08:51:58 2022 # Modules : import requests import icalendar - -# Variables générales : -rooms_filen = "rooms.txt" +import datetime # Fonctions : +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()} + def sched_get(date) : """ Récupère l'emploi du temps de toutes les salles (pour le moment, juste @@ -46,15 +59,13 @@ def sched_get(date) : year = str(date.year) r = requests.get("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) - print(r.content) return r.content -def used_rooms_get(datet) : +def getrooms(datet) : """ - Créé la liste des salles occupées à la date 'datet' d'après - l'emploi du temps des salles. + Crée une liste de toute les salles, avec des informations si elles sont libres ou non Parameters ---------- @@ -63,71 +74,35 @@ def used_rooms_get(datet) : Returns ------- - used_rooms : list - Liste des salles occupées. total_rooms : list - Toutes les salles mentionnées dans le fichier + total_rooms : dico + Dico 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é : cal = icalendar.Calendar.from_ical(sched_get(datet)) - used_rooms = [] - total_rooms = [] + total_rooms = {} + default_hour_margin = 2 for comp in cal.walk(): - if comp.name == "VEVENT" : - ev_dstart = comp.decoded("dtstart") - ev_dend = comp.decoded("dtend") - roomname = str(comp.get("location")) - if not roomname in total_rooms: - total_rooms.append(roomname) - if ev_dstart.timestamp() <= datet.timestamp() and ev_dend.timestamp() > datet.timestamp() : - if not roomname in used_rooms : - used_rooms.append(roomname) + if comp.name == "VEVENT" : + # 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) - return total_rooms, used_rooms - -def available_rooms_get(total_rooms, used_rooms) : - """ - Créé la liste des salles disponibles d'après la liste des salles occupées - 'used_rooms'. - - Parameters - ---------- - used_rooms : list - Liste des salles occupées. - total_rooms : list - Liste de toute les salles - - Returns - ------- - available_rooms : list - Liste des salles disponibles. - - """ - - available_rooms = [] - - for room in total_rooms : - if room not in used_rooms : - available_rooms.append(room) - - return available_rooms - -def free_at(datet): - """ - Retourne la liste des salles dispo à cette date - - Parameters - ---------- - datet: datetime.Date - La date à laquelle se fixer - - Returns - ------- - available_rooms : list - Liste des salles disponibles. - """ - total,used = used_rooms_get(datet) - free = available_rooms_get(total,used) - return free + return total_rooms