diff --git a/main_cli.py b/main_cli.py index a347948..f38c250 100644 --- a/main_cli.py +++ b/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") 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["free"] : - deltasec = room["occupied_at"].timestamp() - date.timestamp() + if room["is_free"] : + deltasec = room["end"].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 + 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 : 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() + if not room["is_free"] : + deltasec = room["start"].timestamp() - date.timestamp() # 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__": main() diff --git a/rooms_get.py b/rooms_get.py index bbbea72..0ab3f02 100644 --- a/rooms_get.py +++ b/rooms_get.py @@ -22,35 +22,35 @@ import datetime # 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 ---------- name : str Le nom de la salle. - occupied_at : datetime.datetime or None - La prochaine heure à laquelle elle est occupée, ou None si salle déjà occupée. - free_at : datetime.datetime or None - La prochaine heure à laquelle est est libre, ou None, si elle est déjà libre. + start : datetime.datetime + Salle occupée : heure de début de la prochaine période de disponibilité. + Salle libre : inutilisé (vaut la date du jour à 00:00). + 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 ------- 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} + 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 de l'UFR) sur ADE depuis le site de l'Unistra. @@ -58,7 +58,8 @@ def sched_get(date, link=None) : Parameters ---------- 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: link: @@ -67,6 +68,9 @@ def sched_get(date, link=None) : $MONTH$ : le mois $DAY$ : le jour 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 ------- @@ -76,15 +80,30 @@ def sched_get(date, link=None) : """ 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) - month = str(date.month) - year = str(date.year) - - finallink = link.replace("$DAY$",day) - finallink = finallink.replace("$MONTH$",month) - finallink = finallink.replace("$YEAR$",year) + 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 @@ -108,13 +127,46 @@ def getrooms(datet, links=[]) : # Récupération des informations sur l'EDT téléchargé : cals = [] - for i in links: + 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 + 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 = {} # 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 comp in cal.walk() : # Événements if comp.name == "VEVENT" : @@ -125,21 +177,27 @@ def getrooms(datet, links=[]) : # Soit l'événement se passe maintenant (salle occupée maintenant) : if datestart.timestamp() <= datet.timestamp() and dateend.timestamp() > datet.timestamp() : - occupied_at = None - free_at = dateend - total_rooms[roomname] = room(roomname, occupied_at, free_at) + start = dateend # L'heure de début de la prochaine période de disponibilité est la fin de l'événement + if roomname not in total_rooms.keys() : + 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) : elif datestart.timestamp() > datet.timestamp() : if roomname not in total_rooms.keys() : - occupied_at = datestart - free_at = None - total_rooms[roomname] = room(roomname, occupied_at, free_at) - 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 - if datestart.timestamp() < total_rooms[roomname]["occupied_at"].timestamp() : - occupied_at = datestart - free_at = None - total_rooms[roomname] = room(roomname, occupied_at, free_at) + # On suppose d'abord que la salle est libre maintenant : + 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 = datestart # L'heure de fin de disponibilité est le début de l'événement + is_free = True + total_rooms[roomname] = room(roomname, start, end, is_free) + elif datestart.timestamp() < total_rooms[roomname]["end"].timestamp() : + start = total_rooms[roomname]["start"] + 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.