From 65cf7624b4e2e5f8c090f7377216a6a5236061cf Mon Sep 17 00:00:00 2001 From: "theo@manjaro" Date: Tue, 1 Mar 2022 11:05:58 +0100 Subject: [PATCH 1/3] =?UTF-8?q?Filtrer=20par=20occurence=20minimale,=20ain?= =?UTF-8?q?si=20que=20par=20pr=C3=A9sence=20de=20virgule=20dans=20le=20nom?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- main_cli.py | 1 + rooms_get.py | 64 ++++++++++++++++++++++++++++++++-------------------- 2 files changed, 40 insertions(+), 25 deletions(-) diff --git a/main_cli.py b/main_cli.py index 0f9ec33..0a43a59 100644 --- a/main_cli.py +++ b/main_cli.py @@ -25,6 +25,7 @@ import rooms_get as ro # Globales favorites = ["C" + str(i) + " MATH" for i in range(1,12)] + ["C42-CMI"] # TODO : Ne sera pas conservé +favorites = [] links = [] # Liens vers les calendriers des salles des différents bâtiments de l'université diff --git a/rooms_get.py b/rooms_get.py index 5f7a847..3e433f4 100644 --- a/rooms_get.py +++ b/rooms_get.py @@ -46,7 +46,7 @@ def room(name, start, end, is_free): Un dictionnaire contenant ces 4 informations, avec le même nom en clef. """ - + # return {"name":name, "occupied_at":occupied_at, "free_at":free_at, "free":free_at.timestamp() > occupied_at.timestamp()} return {"name":name, "start":start, "end":end, "is_free":is_free} @@ -86,31 +86,31 @@ def sched_get(date, enddate = None, link = None) : day1 = str(date.day) month1 = str(date.month) year1 = str(date.year) - + finallink = link.replace("$DAY1$", day1) finallink = finallink.replace("$MONTH1$", month1) 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) return r.content -def getrooms(datet, links=[]) : +def getrooms(datet, links=[],min_occur=3) : """ Crée une liste de toutes les salles, avec des informations si elles sont libres ou non. @@ -118,6 +118,12 @@ def getrooms(datet, links=[]) : ---------- datet : datetime.datetime() Date au format datetime. + Optionnels: + links : list, par défaut vide + liste des liens à consulter ( si est vide, ping l'ufr ) + min_occur : nombre, par défaut à 3 + Nombre minimum de fois qu'une salle doit être mentionnée pour être comptée + ( permet d'éviter le flood de salles qui n'existe que pour les évals ) Returns ------- @@ -134,22 +140,23 @@ def getrooms(datet, links=[]) : cals = [icalendar.Calendar.from_ical(sched_get(datet))] total_rooms = {} + rooms_count = {} # 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 : - + # On vérifie si le fichier existe : if not os.path.exists("data/schedule" + str(year1) + "-" + str(year2) + ".ics") : # On télécharge l'emploi du temps de l'année scolaire, s'il n'existe pas : @@ -157,15 +164,15 @@ def getrooms(datet, links=[]) : year_cal = sched_get(date1, date2, links) year_cal_file.writelines(year_cal.decode("utf-8")) year_cal_file.close() - + year_cal_file = open("data/schedule" + str(year1) + "-" + str(year2) + ".ics", "rb") - + year_cals = [] for i in links : year_cals.append(icalendar.Calendar.from_ical(year_cal_file.read(), 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(year_cal_file.read())] - + # 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 @@ -177,7 +184,10 @@ def getrooms(datet, links=[]) : 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) - + rooms_count[roomname] = 1 + else: + rooms_count[roomname]+=1 + # Ajout des infos supplémentaires sur les salles (heures de début-fin de dispo, indicateur de dispo), s'il y en a : # Première boucle, pour déterminer les salles occupées : for cal in cals : # Bâtiments @@ -187,14 +197,14 @@ def getrooms(datet, links=[]) : datestart = comp.decoded("dtstart") dateend = comp.decoded("dtend") roomname = str(comp.get("location")) - + # L'événement se passe maintenant (salle occupée maintenant) : if datestart.timestamp() <= datet.timestamp() and dateend.timestamp() > datet.timestamp() : start = dateend # L'heure de début de la prochaine période de disponibilité est la fin de l'événement 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 = False total_rooms[roomname] = room(roomname, start, end, is_free) - + # Deuxième boucle, pour ajouter les heures de dispos des salles : for cal in cals : # Bâtiments for comp in cal.walk() : # Événements @@ -203,7 +213,7 @@ def getrooms(datet, links=[]) : datestart = comp.decoded("dtstart") dateend = comp.decoded("dtend") roomname = str(comp.get("location")) - + # L'événement se passe prochainement (salle occupée à l'occasion de cet événement) : if datestart.timestamp() > datet.timestamp() : if roomname not in total_rooms.keys() : @@ -221,23 +231,27 @@ def getrooms(datet, links=[]) : 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. - + # # 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"] - + # Filtrer les salles qui ne sont mentionnées qu'un certain nombre de fois + # Et qui n'on pas de virgule dans le nom + for roomname in rooms_count.keys(): + if rooms_count[roomname] Date: Tue, 1 Mar 2022 11:13:57 +0100 Subject: [PATCH 2/3] =?UTF-8?q?Recherche=20des=20salles=20sur=20une=20p?= =?UTF-8?q?=C3=A9riode=20d'un=20mois?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- rooms_get.py | 12 +++++++----- 1 file changed, 7 insertions(+), 5 deletions(-) diff --git a/rooms_get.py b/rooms_get.py index 3e433f4..7346161 100644 --- a/rooms_get.py +++ b/rooms_get.py @@ -156,7 +156,7 @@ def getrooms(datet, links=[],min_occur=3) : date2 = datetime.datetime(year2, 8, 1) # Création du calendrier de l'année scolaire : - + """ # On vérifie si le fichier existe : if not os.path.exists("data/schedule" + str(year1) + "-" + str(year2) + ".ics") : # On télécharge l'emploi du temps de l'année scolaire, s'il n'existe pas : @@ -166,12 +166,14 @@ def getrooms(datet, links=[],min_occur=3) : year_cal_file.close() year_cal_file = open("data/schedule" + str(year1) + "-" + str(year2) + ".ics", "rb") - + """ + margintime = datetime.timedelta(weeks=4) year_cals = [] - for i in links : - year_cals.append(icalendar.Calendar.from_ical(year_cal_file.read(), link = i)) + for i in links : # Choper les liens mentionné, sur une période d'un mois + result = sched_get(datet, datet+margintime, links) + year_cals.append(icalendar.Calendar.from_ical(result)) 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(year_cal_file.read())] + year_cals = [icalendar.Calendar.from_ical(sched_get(datet,datet+margintime))] # Ajout de toutes les salles contenues dans le calendrier de l'année scolaire : for cal in year_cals : # Bâtiments From 8425b960ebdd8db2a463ac22f82b8d794c1ef62b Mon Sep 17 00:00:00 2001 From: "theo@manjaro" Date: Tue, 1 Mar 2022 11:18:39 +0100 Subject: [PATCH 3/3] Redux --- rooms_get.py | 26 +------------------------- 1 file changed, 1 insertion(+), 25 deletions(-) diff --git a/rooms_get.py b/rooms_get.py index 7346161..08acc5b 100644 --- a/rooms_get.py +++ b/rooms_get.py @@ -143,33 +143,9 @@ def getrooms(datet, links=[],min_occur=3) : rooms_count = {} # 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 : - """ - # On vérifie si le fichier existe : - if not os.path.exists("data/schedule" + str(year1) + "-" + str(year2) + ".ics") : - # On télécharge l'emploi du temps de l'année scolaire, s'il n'existe pas : - year_cal_file = open("data/schedule" + str(year1) + "-" + str(year2) + ".ics", "w") - year_cal = sched_get(date1, date2, links) - year_cal_file.writelines(year_cal.decode("utf-8")) - year_cal_file.close() - - year_cal_file = open("data/schedule" + str(year1) + "-" + str(year2) + ".ics", "rb") - """ margintime = datetime.timedelta(weeks=4) year_cals = [] - for i in links : # Choper les liens mentionné, sur une période d'un mois + for i in links : # Choper les liens mentionné, sur une période de quatres mois result = sched_get(datet, datet+margintime, links) year_cals.append(icalendar.Calendar.from_ical(result)) if len(links) == 0 : # Par défaut, ne mets pas de lien, ce qui retourne celui de l'UFR