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")
date_choice = 0
ignore_list = ["salle non définie", "salle en Distanciel"]
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> "))
dept_filen = "data/dept_list.txt"
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()
else : # Heure mannuelle
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 :
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["is_free"] :
deltasec = room["end"].timestamp() - date.timestamp()
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.is_free :
deltasec = room.end.timestamp() - date.timestamp()
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
deltasec = date_tools.minutes_convert(deltasec / 60 + 0.5)
@ -68,17 +94,17 @@ def main() :
remain_time_str += " " + str(deltasec[1]) + " minutes"
# print(" - " + room["name"]+" | occupée dans : "+str(int(deltasec/60+0.5))+" minutes")
if room["end"].hour == 23 and room["end"].minute == 59 :
print(" - " + room["name"])
if room.end.hour == 23 and room.end.minute == 59 and room.end.second == 59 :
print(" - " + room.name)
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 :
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["is_free"] :
deltasec = room["start"].timestamp() - date.timestamp()
for room in available_rooms :
if room.name in favorites or len(favorites) == 0 :
if not room.is_free :
deltasec = room.start.timestamp() - date.timestamp()
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
deltasec = date_tools.minutes_convert(deltasec / 60 + 0.5)
@ -87,10 +113,10 @@ def main() :
remain_time_str += " " + str(deltasec[1]) + " minutes"
# print(" - " + room["name"]+" | libre dans : "+str(int(deltasec/60+0.5))+" minutes")
if room["end"].hour == 23 and room["end"].minute == 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 ?)
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 ?)
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__":
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 :
import requests
import icalendar
import datetime
import os
from objects import Room
from objects import Dept
# Fonctions :
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.
# 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.
Parameters
----------
name : str
Le nom de la salle.
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').
# Parameters
# ----------
# name : str
# Le nom de la salle.
# 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 4 informations, avec le même nom en clef.
# Returns
# -------
# dict
# 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}
# # 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}
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
de l'UFR) sur ADE depuis le site de l'Unistra.
@ -77,12 +78,13 @@ def sched_get(date, enddate = None, link = None) :
-------
bytes
Le texte du résultat de la requête.
"""
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$"
# 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 += "&firstDate=$YEAR1$-$MONTH1$-$DAY1$&lastDate=$YEAR2$-$MONTH2$-$DAY2$"
day1 = str(date.day)
month1 = str(date.month)
year1 = str(date.year)
@ -104,132 +106,186 @@ def sched_get(date, enddate = None, link = None) :
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=[],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
----------
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 )
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 : dict
Dictionnaire des salles, indexées par leur nom.
Toutes les salles mentionnées dans le fichier, avec des informations.
total_rooms : list
Liste des salles.
"""
total_rooms = list()
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)
cal_start = datet
if cal_start.month == 1 :
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
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 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
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.append(Room(roomname, start, end, is_free))
return total_rooms
# 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 = [icalendar.Calendar.from_ical(sched_get(datet))]
total_rooms = {}
rooms_count = {}
# default_hour_margin = 2
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).
margintime = datetime.timedelta(weeks = 4)
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))]
Parameters
----------
datet : datetime.datetime()
Date pour la recherche de salles.
# 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)
rooms_count[roomname] = 1
else:
rooms_count[roomname]+=1
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 :
# Première boucle, pour déterminer les salles occupées :
for cal in cals : # Bâtiments
for comp in cal.walk() : # Événements
if comp.name == "VEVENT" :
# Récupération des infos :
datestart = comp.decoded("dtstart")
dateend = comp.decoded("dtend")
roomname = str(comp.get("location"))
for comp in cal.walk() : # Événements
if comp.name == "VEVENT" :
# Récupération des infos :
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)
# 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
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 :
for cal in cals : # Bâtiments
for comp in cal.walk() : # Événements
if comp.name == "VEVENT" :
# Récupération des infos :
datestart = comp.decoded("dtstart")
dateend = comp.decoded("dtend")
roomname = str(comp.get("location"))
for comp in cal.walk() : # Événements
if comp.name == "VEVENT" :
# Récupération des infos :
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() :
# La salle est forcément libre, car les salles occupées sont déjà toutes enregistrées :
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() :
if datestart.timestamp() == total_rooms[roomname]["start"].timestamp() :
start = dateend
end = total_rooms[roomname]["end"]
else :
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.
# # 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])
# L'événement se passe prochainement (salle occupée à l'occasion de cet événement) :
if datestart.timestamp() > datet.timestamp() :
for r in total_rooms :
if r.name == roomname :
if datestart.timestamp() < r.end.timestamp() :
if datestart.timestamp() == r.start.timestamp() :
start = dateend
end = r.end
else :
start = r.end
end = datestart
is_free = r.is_free
r = Room(roomname, start, end, is_free)
return total_rooms