Merge branch 'master' of https://forge.chapril.org/CretinsMotorisesIngenieux/UniSquat
This commit is contained in:
commit
f3cbd129e3
@ -25,6 +25,7 @@ import rooms_get as ro
|
||||
|
||||
# Globales
|
||||
favorites = ["C" + str(i) + " MATH" for i in range(1,12)] + ["C42-CMI"] # TODO : Ne sera pas conservé
|
||||
favorites = []
|
||||
links = [] # Liens vers les calendriers des salles des différents bâtiments de l'université
|
||||
|
||||
|
||||
|
84
rooms_get.py
84
rooms_get.py
@ -46,7 +46,7 @@ def room(name, start, end, is_free):
|
||||
Un dictionnaire contenant ces 4 informations, avec le même nom en clef.
|
||||
|
||||
"""
|
||||
|
||||
|
||||
# return {"name":name, "occupied_at":occupied_at, "free_at":free_at, "free":free_at.timestamp() > occupied_at.timestamp()}
|
||||
return {"name":name, "start":start, "end":end, "is_free":is_free}
|
||||
|
||||
@ -86,31 +86,31 @@ def sched_get(date, enddate = None, link = None) :
|
||||
day1 = str(date.day)
|
||||
month1 = str(date.month)
|
||||
year1 = str(date.year)
|
||||
|
||||
|
||||
finallink = link.replace("$DAY1$", day1)
|
||||
finallink = finallink.replace("$MONTH1$", month1)
|
||||
finallink = finallink.replace("$YEAR1$", year1)
|
||||
|
||||
|
||||
if enddate != None :
|
||||
day2 = str(enddate.day)
|
||||
month2 = str(enddate.month)
|
||||
year2 = str(enddate.year)
|
||||
|
||||
|
||||
finallink = finallink.replace("$DAY2$", day2)
|
||||
finallink = finallink.replace("$MONTH2$", month2)
|
||||
finallink = finallink.replace("$YEAR2$", year2)
|
||||
|
||||
|
||||
else :
|
||||
finallink = finallink.replace("$DAY2$", day1)
|
||||
finallink = finallink.replace("$MONTH2$", month1)
|
||||
finallink = finallink.replace("$YEAR2$", year1)
|
||||
|
||||
|
||||
r = requests.get(finallink)
|
||||
|
||||
return r.content
|
||||
|
||||
|
||||
def getrooms(datet, links=[]) :
|
||||
def getrooms(datet, links=[],min_occur=3) :
|
||||
"""
|
||||
Crée une liste de toutes les salles, avec des informations si elles sont libres ou non.
|
||||
|
||||
@ -118,6 +118,12 @@ def getrooms(datet, links=[]) :
|
||||
----------
|
||||
datet : datetime.datetime()
|
||||
Date au format datetime.
|
||||
Optionnels:
|
||||
links : list, par défaut vide
|
||||
liste des liens à consulter ( si est vide, ping l'ufr )
|
||||
min_occur : nombre, par défaut à 3
|
||||
Nombre minimum de fois qu'une salle doit être mentionnée pour être comptée
|
||||
( permet d'éviter le flood de salles qui n'existe que pour les évals )
|
||||
|
||||
Returns
|
||||
-------
|
||||
@ -134,38 +140,17 @@ def getrooms(datet, links=[]) :
|
||||
cals = [icalendar.Calendar.from_ical(sched_get(datet))]
|
||||
|
||||
total_rooms = {}
|
||||
rooms_count = {}
|
||||
# default_hour_margin = 2
|
||||
|
||||
# Création du dico de toutes les salles (récupération de l'emploi du temps de l'année entière, pour être sûr d'obtenir toutes les salles disponibles):
|
||||
|
||||
if datet.month >= 9 : # Si on est au début de l'année scolaire (par ex : en 2021, si l'année scolaire est 2021-2022)
|
||||
year1 = datet.year # Année civile de début de l'année scolaire
|
||||
year2 = datet.year + 1 # Année civile de fin de l'année scolaire
|
||||
else :
|
||||
year1 = datet.year - 1
|
||||
year2 = datet.year
|
||||
|
||||
date1 = datetime.datetime(year1, 9, 1)
|
||||
date2 = datetime.datetime(year2, 8, 1)
|
||||
|
||||
# Création du calendrier de l'année scolaire :
|
||||
|
||||
# On vérifie si le fichier existe :
|
||||
if not os.path.exists("data/schedule" + str(year1) + "-" + str(year2) + ".ics") :
|
||||
# On télécharge l'emploi du temps de l'année scolaire, s'il n'existe pas :
|
||||
year_cal_file = open("data/schedule" + str(year1) + "-" + str(year2) + ".ics", "w")
|
||||
year_cal = sched_get(date1, date2, links)
|
||||
year_cal_file.writelines(year_cal.decode("utf-8"))
|
||||
year_cal_file.close()
|
||||
|
||||
year_cal_file = open("data/schedule" + str(year1) + "-" + str(year2) + ".ics", "rb")
|
||||
|
||||
|
||||
margintime = datetime.timedelta(weeks=4)
|
||||
year_cals = []
|
||||
for i in links :
|
||||
year_cals.append(icalendar.Calendar.from_ical(year_cal_file.read(), link = i))
|
||||
for i in links : # Choper les liens mentionné, sur une période de quatres mois
|
||||
result = sched_get(datet, datet+margintime, links)
|
||||
year_cals.append(icalendar.Calendar.from_ical(result))
|
||||
if len(links) == 0 : # Par défaut, ne mets pas de lien, ce qui retourne celui de l'UFR
|
||||
year_cals = [icalendar.Calendar.from_ical(year_cal_file.read())]
|
||||
|
||||
year_cals = [icalendar.Calendar.from_ical(sched_get(datet,datet+margintime))]
|
||||
|
||||
# Ajout de toutes les salles contenues dans le calendrier de l'année scolaire :
|
||||
for cal in year_cals : # Bâtiments
|
||||
for comp in cal.walk() : # Événements
|
||||
@ -177,7 +162,10 @@ def getrooms(datet, links=[]) :
|
||||
end = datet.replace(hour = 23, minute = 59, second = 59) # Par défaut, l'heure de fin de la prochaine période disponibilité est aujourd'hui à 23:59
|
||||
is_free = True # Par défaut, la salle est libre
|
||||
total_rooms[roomname] = room(roomname, start, end, is_free)
|
||||
|
||||
rooms_count[roomname] = 1
|
||||
else:
|
||||
rooms_count[roomname]+=1
|
||||
|
||||
# Ajout des infos supplémentaires sur les salles (heures de début-fin de dispo, indicateur de dispo), s'il y en a :
|
||||
# Première boucle, pour déterminer les salles occupées :
|
||||
for cal in cals : # Bâtiments
|
||||
@ -187,14 +175,14 @@ def getrooms(datet, links=[]) :
|
||||
datestart = comp.decoded("dtstart")
|
||||
dateend = comp.decoded("dtend")
|
||||
roomname = str(comp.get("location"))
|
||||
|
||||
|
||||
# L'événement se passe maintenant (salle occupée maintenant) :
|
||||
if datestart.timestamp() <= datet.timestamp() and dateend.timestamp() > datet.timestamp() :
|
||||
start = dateend # L'heure de début de la prochaine période de disponibilité est la fin de l'événement
|
||||
end = datet.replace(hour = 23, minute = 59, second = 59) # Par défaut, l'heure de fin de la prochaine période disponibilité est aujourd'hui à 23:59
|
||||
is_free = False
|
||||
total_rooms[roomname] = room(roomname, start, end, is_free)
|
||||
|
||||
|
||||
# Deuxième boucle, pour ajouter les heures de dispos des salles :
|
||||
for cal in cals : # Bâtiments
|
||||
for comp in cal.walk() : # Événements
|
||||
@ -203,7 +191,7 @@ def getrooms(datet, links=[]) :
|
||||
datestart = comp.decoded("dtstart")
|
||||
dateend = comp.decoded("dtend")
|
||||
roomname = str(comp.get("location"))
|
||||
|
||||
|
||||
# L'événement se passe prochainement (salle occupée à l'occasion de cet événement) :
|
||||
if datestart.timestamp() > datet.timestamp() :
|
||||
if roomname not in total_rooms.keys() :
|
||||
@ -221,23 +209,27 @@ def getrooms(datet, links=[]) :
|
||||
end = datestart
|
||||
is_free = total_rooms[roomname]["is_free"]
|
||||
total_rooms[roomname] = room(roomname, start, end, is_free)
|
||||
|
||||
|
||||
# Dans les autres cas, l'événement est passé, donc on l'ignore et on passe au suivant.
|
||||
|
||||
|
||||
# # On ignore si c'est avant la date actuelle (avec une valeur loin dans le futur)
|
||||
# if datestart.timestamp() < datet.timestamp() :
|
||||
# datestart = datet + datetime.timedelta(hours = default_hour_margin) # Par défaut, si il n'y a rien de précisé pour sa prochaine occupation, elle sera occupée dans 1 ans
|
||||
# if dateend.timestamp() < datet.timestamp() :
|
||||
# dateend = datestart + datetime.timedelta(hours = default_hour_margin) # Par défaut, si il n'y a rien de précisé pour sa prochaine occupation, elle sera occupée dans 1 an après son occupation
|
||||
|
||||
|
||||
# Enregistrement dans le dictionnaire :
|
||||
|
||||
|
||||
# Plus nécessaire, car on ne s'occupe plus des événements passés :
|
||||
|
||||
|
||||
# if roomname in total_rooms.keys() :
|
||||
# if datestart.timestamp() > total_rooms[roomname]["occupied_at"].timestamp() :
|
||||
# occupied_at = total_rooms[roomname]["occupied_at"]
|
||||
# if dateend.timestamp() > total_rooms[roomname]["free_at"].timestamp() :
|
||||
# free_at = total_rooms[roomname]["free_at"]
|
||||
|
||||
# Filtrer les salles qui ne sont mentionnées qu'un certain nombre de fois
|
||||
# Et qui n'on pas de virgule dans le nom
|
||||
for roomname in rooms_count.keys():
|
||||
if rooms_count[roomname]<min_occur or "," in roomname:
|
||||
del(total_rooms[roomname])
|
||||
return total_rooms
|
||||
|
Loading…
Reference in New Issue
Block a user