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:
parent
43f179c631
commit
f66c516773
122
data/dept_list.txt
Normal file
122
data/dept_list.txt
Normal 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
|
143377
data/schedule2021-2022.ics
143377
data/schedule2021-2022.ics
File diff suppressed because it is too large
Load Diff
@ -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
|
64
main_cli.py
64
main_cli.py
@ -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
73
objects.py
Normal 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
|
256
rooms_get.py
256
rooms_get.py
@ -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,11 +78,12 @@ 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)
|
||||
@ -105,70 +107,149 @@ def sched_get(date, enddate = None, link = None) :
|
||||
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.
|
||||
"""
|
||||
|
||||
# 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 = list()
|
||||
|
||||
total_rooms = {}
|
||||
rooms_count = {}
|
||||
# default_hour_margin = 2
|
||||
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)
|
||||
|
||||
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))]
|
||||
cal_start = datet
|
||||
|
||||
# Ajout de toutes les salles contenues dans le calendrier de l'année scolaire :
|
||||
for cal in year_cals : # Bâtiments
|
||||
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 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
|
||||
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
|
||||
total_rooms.append(Room(roomname, start, end, is_free))
|
||||
|
||||
return total_rooms
|
||||
|
||||
|
||||
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 :
|
||||
# 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 :
|
||||
@ -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
|
||||
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)
|
||||
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 :
|
||||
@ -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) :
|
||||
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() :
|
||||
for r in total_rooms :
|
||||
if r.name == roomname :
|
||||
if datestart.timestamp() < r.end.timestamp() :
|
||||
if datestart.timestamp() == r.start.timestamp() :
|
||||
start = dateend
|
||||
end = total_rooms[roomname]["end"]
|
||||
end = r.end
|
||||
else :
|
||||
start = total_rooms[roomname]["start"]
|
||||
start = r.end
|
||||
end = datestart
|
||||
is_free = total_rooms[roomname]["is_free"]
|
||||
total_rooms[roomname] = room(roomname, start, end, is_free)
|
||||
is_free = r.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
|
||||
|
Loading…
x
Reference in New Issue
Block a user