Ajout des améliorations faites sur la version C++ :

- Classe Room plutôt que dictionnaire
- Ajout de la possibilité de choisir un département (avec classe Dept)
Corrections diverses
This commit is contained in:
antux18 2022-05-07 18:51:23 +02:00
parent 43f179c631
commit f66c516773
6 changed files with 427 additions and 143543 deletions

122
data/dept_list.txt Normal file
View File

@ -0,0 +1,122 @@
UFR de Mathématiques-Informatique
https://adecons.unistra.fr/jsp/custom/modules/plannings/anonymous_cal.jsp?resources=30626&projectId=8&calType=ical
EOST - École et Observatoire des Sciences de la Terre
https://adecons.unistra.fr/jsp/custom/modules/plannings/anonymous_cal.jsp?resources=30773&projectId=8&calType=ical
Atrium
https://adecons.unistra.fr/jsp/custom/modules/plannings/anonymous_cal.jsp?resources=5208&projectId=8&calType=ical
Escarpe
https://adecons.unistra.fr/jsp/custom/modules/plannings/anonymous_cal.jsp?resources=336&projectId=8&calType=ical
Faculté de Chimie
https://adecons.unistra.fr/jsp/custom/modules/plannings/anonymous_cal.jsp?resources=336&projectId=8&calType=ical
Faculté de Droit
https://adecons.unistra.fr/jsp/custom/modules/plannings/anonymous_cal.jsp?resources=304&projectId=8&calType=ical
I.P.C.B
https://adecons.unistra.fr/jsp/custom/modules/plannings/anonymous_cal.jsp?resources=30695&projectId=8&calType=ical
Institut Le Bel
https://adecons.unistra.fr/jsp/custom/modules/plannings/anonymous_cal.jsp?resources=5188&projectId=8&calType=ical
Le Portique
https://adecons.unistra.fr/jsp/custom/modules/plannings/anonymous_cal.jsp?resources=8824&projectId=8&calType=ical
Pangloss
https://adecons.unistra.fr/jsp/custom/modules/plannings/anonymous_cal.jsp?resources=4480&projectId=8&calType=ical
Patio
https://adecons.unistra.fr/jsp/custom/modules/plannings/anonymous_cal.jsp?resources=4484&projectId=8&calType=ical
Plateforme de biologie
https://adecons.unistra.fr/jsp/custom/modules/plannings/anonymous_cal.jsp?resources=5333&projectId=8&calType=ical
Athena
https://adecons.unistra.fr/jsp/custom/modules/plannings/anonymous_cal.jsp?resources=33171&projectId=8&calType=ical
Collège Doctoral Européen
https://adecons.unistra.fr/jsp/custom/modules/plannings/anonymous_cal.jsp?resources=22444&projectId=8&calType=ical
M.I.S.H.A
https://adecons.unistra.fr/jsp/custom/modules/plannings/anonymous_cal.jsp?resources=4472&projectId=8&calType=ical
MDP - Maison des personnels
https://adecons.unistra.fr/jsp/custom/modules/plannings/anonymous_cal.jsp?resources=39466&projectId=8&calType=ical
Présidence
https://adecons.unistra.fr/jsp/custom/modules/plannings/anonymous_cal.jsp?resources=10310&projectId=8&calType=ical
Faculté de Géographie
https://adecons.unistra.fr/jsp/custom/modules/plannings/anonymous_cal.jsp?resources=30614&projectId=8&calType=ical
Faculté de Psychologie
https://adecons.unistra.fr/jsp/custom/modules/plannings/anonymous_cal.jsp?resources=30612&projectId=8&calType=ical
Institut botanique
https://adecons.unistra.fr/jsp/custom/modules/plannings/anonymous_cal.jsp?resources=5144&projectId=8&calType=ical
Institut de Physique
https://adecons.unistra.fr/jsp/custom/modules/plannings/anonymous_cal.jsp?resources=30597&projectId=8&calType=ical
Institut de Zoologie
https://adecons.unistra.fr/jsp/custom/modules/plannings/anonymous_cal.jsp?resources=30696&projectId=8&calType=ical
Palais universitaire
https://adecons.unistra.fr/jsp/custom/modules/plannings/anonymous_cal.jsp?resources=4474&projectId=8&calType=ical
Médecine
https://adecons.unistra.fr/jsp/custom/modules/plannings/anonymous_cal.jsp?resources=10172&projectId=8&calType=ical
Dentaire
https://adecons.unistra.fr/jsp/custom/modules/plannings/anonymous_cal.jsp?resources=25353&projectId=8&calType=ical
Cardo
https://adecons.unistra.fr/jsp/custom/modules/plannings/anonymous_cal.jsp?resources=7429&projectId=8&calType=ical
Ensemble Saint Georges
https://adecons.unistra.fr/jsp/custom/modules/plannings/anonymous_cal.jsp?resources=311&projectId=8&calType=ical
Galiléo
https://adecons.unistra.fr/jsp/custom/modules/plannings/anonymous_cal.jsp?resources=50&projectId=8&calType=ical
C.R.L - Pôle Lansad
https://adecons.unistra.fr/jsp/custom/modules/plannings/anonymous_cal.jsp?resources=11715&projectId=8&calType=ical
École de Management
https://adecons.unistra.fr/jsp/custom/modules/plannings/anonymous_cal.jsp?resources=30694&projectId=8&calType=ical
Faculté des Sciences Économiques et de Gestion
https://adecons.unistra.fr/jsp/custom/modules/plannings/anonymous_cal.jsp?resources=96&projectId=8&calType=ical
Institut Mécanique des Fluides
https://adecons.unistra.fr/jsp/custom/modules/plannings/anonymous_cal.jsp?resources=30594&projectId=8&calType=ical
INSPÉ Colmar
https://adecons.unistra.fr/jsp/custom/modules/plannings/anonymous_cal.jsp?resources=30622&projectId=8&calType=ical
E.C.P.M - Cronenbourg
https://adecons.unistra.fr/jsp/custom/modules/plannings/anonymous_cal.jsp?resources=316&projectId=8&calType=ical
ENGEES
https://adecons.unistra.fr/jsp/custom/modules/plannings/anonymous_cal.jsp?resources=30705&projectId=8&calType=ical
IUT Hagenau
https://adecons.unistra.fr/jsp/custom/modules/plannings/anonymous_cal.jsp?resources=30607&projectId=8&calType=ical
EOST - Rue Blessig
https://adecons.unistra.fr/jsp/custom/modules/plannings/anonymous_cal.jsp?resources=30633&projectId=8&calType=ical
Goethe 43
https://adecons.unistra.fr/jsp/custom/modules/plannings/anonymous_cal.jsp?resources=9899&projectId=8&calType=ical
IUT Louis Pasteur
https://adecons.unistra.fr/jsp/custom/modules/plannings/anonymous_cal.jsp?resources=30619&projectId=8&calType=ical
INSPÉ Séléstat
https://adecons.unistra.fr/jsp/custom/modules/plannings/anonymous_cal.jsp?resources=30600&projectId=8&calType=ical
4, rue Boussingault
https://adecons.unistra.fr/jsp/custom/modules/plannings/anonymous_cal.jsp?resources=30593&projectId=8&calType=ical
7, rue de l'Université
https://adecons.unistra.fr/jsp/custom/modules/plannings/anonymous_cal.jsp?resources=5166&projectId=8&calType=ical
Boulevard Lefebvre S.F.C. (ex. IPST)
https://adecons.unistra.fr/jsp/custom/modules/plannings/anonymous_cal.jsp?resources=8108&projectId=8&calType=ical
INSPÉ Meinau (nouveau bâtiment)
https://adecons.unistra.fr/jsp/custom/modules/plannings/anonymous_cal.jsp?resources=30605&projectId=8&calType=ical
INSPÉ Neudorf (école annexe)
https://adecons.unistra.fr/jsp/custom/modules/plannings/anonymous_cal.jsp?resources=98&projectId=8&calType=ical
S.F.C.
https://adecons.unistra.fr/jsp/custom/modules/plannings/anonymous_cal.jsp?resources=30665&projectId=8&calType=ical
IUT Informatique - Illkirch
https://adecons.unistra.fr/jsp/custom/modules/plannings/anonymous_cal.jsp?resources=30678&projectId=8&calType=ical
IUT Leonardo - Illkirch
https://adecons.unistra.fr/jsp/custom/modules/plannings/anonymous_cal.jsp?resources=30610&projectId=8&calType=ical
IUT Génie Civil - Illkirch
https://adecons.unistra.fr/jsp/custom/modules/plannings/anonymous_cal.jsp?resources=30667&projectId=8&calType=ical&
IUT Chimie - Illkirch
https://adecons.unistra.fr/jsp/custom/modules/plannings/anonymous_cal.jsp?resources=30661&projectId=8&calType=ical
IUT - Bloc Central - Illkirch
https://adecons.unistra.fr/jsp/custom/modules/plannings/anonymous_cal.jsp?resources=30658&projectId=8&calType=ical
ISU - Ext - Illkirch
https://adecons.unistra.fr/jsp/custom/modules/plannings/anonymous_cal.jsp?resources=209&projectId=8&calType=ical
Faculté de Pharmacie - Illkirch
https://adecons.unistra.fr/jsp/custom/modules/plannings/anonymous_cal.jsp?resources=5095&projectId=8&calType=ical
Bibliothèque IUT Pharmacie - Illkirch
https://adecons.unistra.fr/jsp/custom/modules/plannings/anonymous_cal.jsp?resources=37765&projectId=8&calType=ical
API - Bâtiment A (central) - Illkirch
https://adecons.unistra.fr/jsp/custom/modules/plannings/anonymous_cal.jsp?resources=30602&projectId=8&calType=ical
API - Bâtiment B (télécom) - Illkirch
https://adecons.unistra.fr/jsp/custom/modules/plannings/anonymous_cal.jsp?resources=18442&projectId=8&calType=ical
API - Bâtiment C (télécom) - Illkirch
https://adecons.unistra.fr/jsp/custom/modules/plannings/anonymous_cal.jsp?resources=30653&projectId=8&calType=ical
API - Bâtiment D (ESBS) - Illkirch
https://adecons.unistra.fr/jsp/custom/modules/plannings/anonymous_cal.jsp?resources=30634&projectId=8&calType=ical
API - Bâtiment E (CEBGS) - Illkirch
https://adecons.unistra.fr/jsp/custom/modules/plannings/anonymous_cal.jsp?resources=30651&projectId=8&calType=ical
API - Bâtiment I (laboratoire SERTIT) - Illkirch
https://adecons.unistra.fr/jsp/custom/modules/plannings/anonymous_cal.jsp?resources=19336&projectId=8&calType=ical
API - Bâtiment J (hall techno) - Illkirch
https://adecons.unistra.fr/jsp/custom/modules/plannings/anonymous_cal.jsp?resources=30688&projectId=8&calType=ical

File diff suppressed because it is too large Load Diff

View File

@ -1,16 +0,0 @@
def intersection(l1,l2):
"""
intersection: Renvois une liste contenant les éléments communs aux deux listes
Si aucun élément n'est en commun, retourne une liste vide.
Ne supprimme pas les doublons
Arguments:
l1 : liste
l2 : liste
Résultat:
Une liste contenant tout les éléments communs
"""
result = []
for element in l1:
if element in l2:
result.append(element)
return result

View File

@ -43,23 +43,49 @@ def main() :
print("~~~ UniSquat ~~~\n") print("~~~ UniSquat ~~~\n")
date_choice = 0 ignore_list = ["salle non définie", "salle en Distanciel"]
while date_choice not in (1,2) : dept_filen = "data/dept_list.txt"
date_choice = int(input("Souhaitez-vous afficher les salles disponibles maintenant (1), où à une date précise (2) ?\n> "))
if date_choice == 1 : # Heure système dept_list = ro.get_depts(dept_filen)
print("Les départements suivants sont disponibles :\n")
i = 0
for d in dept_list :
print(" - " + d.name + "(" + str(i) + ")")
i += 1
choice = -1
# Choix du département :
while choice not in range(len(dept_list)) :
choice = int(input("Entrez le numéro du département.\n> "))
dept = dept_list[choice]
date_choice = -1
# Choix de la date :
while date_choice not in (0,1) :
date_choice = int(input("Souhaitez-vous afficher les salles disponibles maintenant (0), où à une date précise (1) ?\n> "))
if date_choice == 0 : # Heure système
date = datetime.datetime.today() date = datetime.datetime.today()
else : # Heure mannuelle else : # Heure mannuelle
date = date_tools.date_input() date = date_tools.date_input()
available_rooms = ro.getrooms(date,links=links)
print("\nRecherche des salles disponibles, veuillez patienter...\n")
available_rooms = ro.getrooms(date, dept, ignore_list)
# Salles libres à la date indiquée : # Salles libres à la date indiquée :
print("\nLes salles suivantes sont disponibles à " + str(date.hour) + ":" + str(date.minute) + ", le " + str(date.date()) + " :\n") print("\nLes salles suivantes sont disponibles à " + str(date.hour) + ":" + str(date.minute) + ", le " + str(date.date()) + " :\n")
for room in available_rooms.values() : for room in available_rooms :
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.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["is_free"] : if room.is_free :
deltasec = room["end"].timestamp() - date.timestamp() deltasec = room.end.timestamp() - date.timestamp()
remain_time_str = str(int(deltasec / 60 + 0.5)) + " minutes" remain_time_str = str(int(deltasec / 60 + 0.5)) + " minutes"
if deltasec / 60 + 0.5 >= 60 : # Conversion en heures:minutes si les minutes dépassent 60 if deltasec / 60 + 0.5 >= 60 : # Conversion en heures:minutes si les minutes dépassent 60
deltasec = date_tools.minutes_convert(deltasec / 60 + 0.5) deltasec = date_tools.minutes_convert(deltasec / 60 + 0.5)
@ -68,17 +94,17 @@ def main() :
remain_time_str += " " + str(deltasec[1]) + " minutes" remain_time_str += " " + str(deltasec[1]) + " minutes"
# print(" - " + room["name"]+" | occupée dans : "+str(int(deltasec/60+0.5))+" minutes") # print(" - " + room["name"]+" | occupée dans : "+str(int(deltasec/60+0.5))+" minutes")
if room["end"].hour == 23 and room["end"].minute == 59 : if room.end.hour == 23 and room.end.minute == 59 and room.end.second == 59 :
print(" - " + room["name"]) print(" - " + room.name)
else : else :
print(" - " + room["name"] + " | occupée à : " + str(room["end"].hour + 1) + ":" + str(room["end"].minute) + " (dans " + remain_time_str + ")") # TODO : Obligé d'ajouter 1h (problème de fuseau horaire ?) print(" - " + room.name + " | Occupée à : " + str(room.end.hour + 1) + ":" + str(room.end.minute) + " (dans " + remain_time_str + ")") # TODO : Obligé d'ajouter 1h (problème de fuseau horaire ?)
# Salles libres prochainement : # Salles libres prochainement :
print("\nLes salles suivantes seront disponibles prochainement : \n") print("\nLes salles suivantes seront disponibles prochainement : \n")
for room in available_rooms.values() : for room in available_rooms :
if room["name"] in favorites or len(favorites) == 0 : if room.name in favorites or len(favorites) == 0 :
if not room["is_free"] : if not room.is_free :
deltasec = room["start"].timestamp() - date.timestamp() deltasec = room.start.timestamp() - date.timestamp()
remain_time_str = str(int(deltasec / 60 + 0.5)) + " minutes" remain_time_str = str(int(deltasec / 60 + 0.5)) + " minutes"
if deltasec / 60 + 0.5 >= 60 : # Conversion en heures:minutes si les minutes dépassent 60 if deltasec / 60 + 0.5 >= 60 : # Conversion en heures:minutes si les minutes dépassent 60
deltasec = date_tools.minutes_convert(deltasec / 60 + 0.5) deltasec = date_tools.minutes_convert(deltasec / 60 + 0.5)
@ -87,10 +113,10 @@ def main() :
remain_time_str += " " + str(deltasec[1]) + " minutes" remain_time_str += " " + str(deltasec[1]) + " minutes"
# print(" - " + room["name"]+" | libre dans : "+str(int(deltasec/60+0.5))+" minutes") # print(" - " + room["name"]+" | libre dans : "+str(int(deltasec/60+0.5))+" minutes")
if room["end"].hour == 23 and room["end"].minute == 59 : if room.end.hour == 23 and room.end.minute == 59 and room.end.second == 59 :
print(" - " + room["name"] + " | libre à " + str(room["start"].hour + 1) + ":" + str(room["start"].minute) + " (dans " + remain_time_str + ")") # TODO : Obligé d'ajouter 1h (problème de fuseau horaire ?) print(" - " + room.name + " | Libre à " + str(room.start.hour + 1) + ":" + str(room.start.minute) + " (dans " + remain_time_str + ")") # TODO : Obligé d'ajouter 1h (problème de fuseau horaire ?)
else : 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 " + remain_time_str + ")") # TODO : Obligé d'ajouter 1h (problème de fuseau horaire ?) print(" - " + room.name + " | Libre de " + str(room.start.hour + 1) + ":" + str(room.start.minute) + " à " + str(room.end.hour + 1) + ":" + str(room.end.minute) + " (dans " + remain_time_str + ")") # TODO : Obligé d'ajouter 1h (problème de fuseau horaire ?)
if __name__=="__main__": if __name__=="__main__":
main() main()

73
objects.py Normal file
View File

@ -0,0 +1,73 @@
#!/usr/bin/env python3
# -*- coding: utf-8 -*-
"""
Created on Sat May 7 17:29:11 2022
@author: antoine
"""
################
### UniSquat ###
################
"""
Indique toutes les salles disponibles dans les différents départements de
l'Université de Strasbourg.
"""
# Objets :
class Room :
"""
Structure des salles.
Attributes
----------
name : string
Le nom de la salle.
start : Date
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 : Date
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').
count : int
Compte le nombre d'occurences de la salle dans l'emploi du temps;
"""
def __init__(self, name, start, end, is_free) :
self.name = name
self.start = start
self.end = end
self.is_free = is_free
class Dept :
"""
Structure des départements.
Attributes
----------
name : string
Nom du département.
link : string
Lien qui permet d'accéder au fichier iCal du département.
rooms : vector<Room>
La liste des salles de ce département
"""
def __init__(self, name, link, rooms) :
self.name = name
self.link = link
self.rooms = rooms

View File

@ -18,40 +18,41 @@ Created on Thu Feb 24 08:51:58 2022
# Modules : # Modules :
import requests import requests
import icalendar import icalendar
import datetime
import os from objects import Room
from objects import Dept
# Fonctions : # Fonctions :
def room(name, start, end, is_free): # 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 # Parameters
---------- # ----------
name : str # name : str
Le nom de la salle. # Le nom de la salle.
start : datetime.datetime # start : datetime.datetime
Salle occupée : heure de début de la prochaine période de disponibilité. # Salle occupée : heure de début de la prochaine période de disponibilité.
Salle libre : inutilisé (vaut la date du jour à 00:00). # Salle libre : inutilisé (vaut la date du jour à 00:00).
end : datetime.datetime # end : datetime.datetime
Salle occupée : heure de fin de la prochaine période de disponibilité. # Salle occupée : heure de fin de la prochaine période de disponibilité.
Salle libre : heure de fin de disponibilité. # Salle libre : heure de fin de disponibilité.
is_free : bool # is_free : bool
Indique si la salle est libre ('True') ou non ('False'). # Indique si la salle est libre ('True') ou non ('False').
Returns # Returns
------- # -------
dict # dict
Un dictionnaire contenant ces 4 informations, avec le même nom en clef. # 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, "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} # return {"name":name, "start":start, "end":end, "is_free":is_free}
def sched_get(date, enddate = None, link = None) : def sched_get(date, link, enddate = None) :
""" """
Récupère l'emploi du temps de toutes les salles (pour le moment, juste 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. de l'UFR) sur ADE depuis le site de l'Unistra.
@ -77,11 +78,12 @@ def sched_get(date, enddate = None, link = None) :
------- -------
bytes bytes
Le texte du résultat de la requête. Le texte du résultat de la requête.
""" """
if not link: # if not link:
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$" # 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$"
link += "&firstDate=$YEAR1$-$MONTH1$-$DAY1$&lastDate=$YEAR2$-$MONTH2$-$DAY2$"
day1 = str(date.day) day1 = str(date.day)
month1 = str(date.month) month1 = str(date.month)
@ -105,70 +107,149 @@ def sched_get(date, enddate = None, link = None) :
finallink = finallink.replace("$MONTH2$", month1) finallink = finallink.replace("$MONTH2$", month1)
finallink = finallink.replace("$YEAR2$", year1) finallink = finallink.replace("$YEAR2$", year1)
r = requests.get(finallink) r = requests.get(finallink)
return r.content return r.content
def getrooms(datet, links=[],min_occur=3) : def get_depts(filename) :
""" """
Crée une liste de toutes les salles, avec des informations si elles sont libres ou non. Crée une liste de tous les départements disponibles.
Parameters
----------
filename : str
Nom du fichier contenant les départements, et les liens
permettant d'accéder au fichier iCal des salles du département.
Returns
-------
dept_list : list
Liste des départements.
"""
dept_list = list()
dept_file = open(filename, "r")
i = 0
# dept = Dept("", "", [])
dfile_content = dept_file.readlines()
for i in range(len(dfile_content) - 1) :
dept_list.append(Dept(dfile_content[i], dfile_content[i + 1], []))
# for l in dfile_content :
# """
# Une fois sur 2, on va :
# - soit enregistrer le nom du département
# - soit enregistrer son lien, et stocker le département dans la liste
# """
# if i == 0 :
# print(l)
# dept.name = l
# i = 1
# else :
# print(l)
# dept.link = l
# dept_list.append(dept)
# i = 0
dept_file.close()
return dept_list
def get_tot_rooms(datet, dept, ignore_list) :
"""
Crée une liste de toutes les salles du département choisi.
Parameters Parameters
---------- ----------
datet : datetime.datetime() datet : datetime.datetime()
Date au format datetime. Date pour la recherche de salles.
Optionnels:
links : list, par défaut vide dept : Dept
liste des liens à consulter ( si est vide, ping l'ufr ) Bâtiment dans lequel chercher des salles.
min_occur : nombre, par défaut à 3
Nombre minimum de fois qu'une salle doit être mentionnée pour être comptée ignore_list : list
( permet d'éviter le flood de salles qui n'existe que pour les évals ) Liste des noms de salles à ignorer.
Returns Returns
------- -------
total_rooms : dict total_rooms : list
Dictionnaire des salles, indexées par leur nom. Liste des salles.
Toutes les salles mentionnées dans le fichier, avec des informations.
""" """
# Récupération des informations sur l'EDT téléchargé : total_rooms = list()
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 = [icalendar.Calendar.from_ical(sched_get(datet))]
total_rooms = {} margintime = 1 # Marge de temps (en mois) pour le début du calendrier (il se peut que des salles existent et soient dispos, mais qu'elles ne sont pas affichées dans l'EDT du jour choisi, donc on prend l'EDT du mois)
rooms_count = {}
# default_hour_margin = 2
margintime = datetime.timedelta(weeks = 4) cal_start = datet
year_cals = []
for i in links : # Récupérer les liens mentionnés, sur une période de quatres semaines
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(sched_get(datet,datet+margintime))]
# Ajout de toutes les salles contenues dans le calendrier de l'année scolaire : if cal_start.month == 1 :
for cal in year_cals : # Bâtiments cal_start.replace(year = cal_start.year - 1)
cal_start.replace(month = 12)
else :
cal_start.replace(month = cal_start.month - margintime)
# Récupération des calendriers correspondants au lien du département, sur une période de 'margintime' mois :
result = sched_get(datet, dept.link, datet.replace(month = datet.month + margintime))
cal = icalendar.Calendar.from_ical(result)
rnamelist = [] # Contient le nom de toutes les salles indiquées dans la section "LOCATION"
# Parcours de ces calendriers, pour faire la liste de toutes les salles :
for comp in cal.walk() : # Événements for comp in cal.walk() : # Événements
if comp.name == "VEVENT" : if comp.name == "VEVENT" :
# Ajout de la salle dans le dictionnaire, si elle n'y est pas : # Ajout de la salle dans le dictionnaire, si elle n'y est pas :
roomname = str(comp.get("location")) roomname = str(comp.get("location"))
if roomname not in total_rooms.keys() : if roomname not in rnamelist :
rnamelist.append(roomname)
start = datet.replace(hour = 0, minute = 0, second=0) # Par défaut, l'heure de début de disponibilité est aujourd'hui à 00:00 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 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 is_free = True # Par défaut, la salle est libre
total_rooms[roomname] = room(roomname, start, end, is_free) total_rooms.append(Room(roomname, start, end, is_free))
rooms_count[roomname] = 1
else: return total_rooms
rooms_count[roomname]+=1
def getrooms(datet, dept, ignore_list) :
"""
Ajout des informations supplémentaires à la liste des salles
(heures de début-fin de dispo, indicateur de dispo).
Parameters
----------
datet : datetime.datetime()
Date pour la recherche de salles.
dept : Dept
Bâtiment dans lequel chercher des salles.
ignore_list : list
Liste des noms de salles à ignorer.
Returns
-------
total_rooms : list
Liste des salles.
"""
# Création de la liste de toutes les salles :
total_rooms = get_tot_rooms(datet, dept, ignore_list)
# Récupération des calendriers correspondants au lien du département :
result = sched_get(datet, dept.link)
cal = icalendar.Calendar.from_ical(result)
# Ajout des infos supplémentaires sur les salles (heures de début-fin de dispo, indicateur de dispo), s'il y en a : # 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 : # Première boucle, pour déterminer les salles occupées :
for cal in cals : # Bâtiments
for comp in cal.walk() : # Événements for comp in cal.walk() : # Événements
if comp.name == "VEVENT" : if comp.name == "VEVENT" :
# Récupération des infos : # Récupération des infos :
@ -181,10 +262,11 @@ def getrooms(datet, links=[],min_occur=3) :
start = dateend # L'heure de début de la prochaine période de disponibilité est la fin de l'événement 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 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 is_free = False
total_rooms[roomname] = room(roomname, start, end, is_free) for r in total_rooms :
if r.name == roomname :
r = Room(roomname, start, end, is_free)
# Deuxième boucle, pour ajouter les heures de dispos des salles : # Deuxième boucle, pour ajouter les heures de dispos des salles :
for cal in cals : # Bâtiments
for comp in cal.walk() : # Événements for comp in cal.walk() : # Événements
if comp.name == "VEVENT" : if comp.name == "VEVENT" :
# Récupération des infos : # Récupération des infos :
@ -194,42 +276,16 @@ def getrooms(datet, links=[],min_occur=3) :
# L'événement se passe prochainement (salle occupée à l'occasion de cet événement) : # L'événement se passe prochainement (salle occupée à l'occasion de cet événement) :
if datestart.timestamp() > datet.timestamp() : if datestart.timestamp() > datet.timestamp() :
if roomname not in total_rooms.keys() : for r in total_rooms :
# La salle est forcément libre, car les salles occupées sont déjà toutes enregistrées : if r.name == roomname :
start = datet.replace(hour = 0, minute = 0, second=0) # Par défaut, l'heure de début de disponibilité est aujourd'hui à 00:00 if datestart.timestamp() < r.end.timestamp() :
end = datestart # L'heure de fin de disponibilité est le début de l'événement if datestart.timestamp() == r.start.timestamp() :
is_free = True
total_rooms[roomname] = room(roomname, start, end, is_free)
elif datestart.timestamp() < total_rooms[roomname]["end"].timestamp() :
if datestart.timestamp() == total_rooms[roomname]["start"].timestamp() :
start = dateend start = dateend
end = total_rooms[roomname]["end"] end = r.end
else : else :
start = total_rooms[roomname]["start"] start = r.end
end = datestart end = datestart
is_free = total_rooms[roomname]["is_free"] is_free = r.is_free
total_rooms[roomname] = room(roomname, start, end, is_free) r = 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'ont pas de virgule dans le nom
for roomname in rooms_count.keys():
if rooms_count[roomname]<min_occur or "," in roomname:
del(total_rooms[roomname])
return total_rooms return total_rooms