Retour de get_tot_rooms pour régler le pb de parsing trop long (se fait uniquement pour le calendrier d'aujourd'hui, par du mois).

Ajout d'une constante TIMEZONE.
This commit is contained in:
antux18 2024-02-12 13:06:53 +01:00
parent 430e8938a2
commit d79af7ef9b

View File

@ -39,6 +39,9 @@ CACHE_SIZE = 10
# Flag pour utiliser le cache : # Flag pour utiliser le cache :
NO_CACHE = False NO_CACHE = False
# Fuseau horaire :
TIMEZONE = "Europe/Paris"
# Globales : # Globales :
last_cache_init = -999 last_cache_init = -999
@ -87,7 +90,7 @@ def trim(link) :
return result return result
def sched_get(date, link, enddate = None, nocache = False) : def sched_get(date, link, enddate = None, nocache = False, sortcal = False) :
""" """
Récupère l'emploi du temps de toutes les salles sur ADE Récupère l'emploi du temps de toutes les salles sur ADE
depuis le site de l'Unistra. depuis le site de l'Unistra.
@ -109,9 +112,12 @@ def sched_get(date, link, enddate = None, nocache = False) :
Date de fin du calendrier à télécharger (par défaut, il s'agit de Date de fin du calendrier à télécharger (par défaut, il s'agit de
la date de début). la date de début).
nocache : booléen nocache : bool
Si mis à 'True', ne lit et ne modifie pas le dossier CACHE_DIR. Si mis à 'True', ne lit et ne modifie pas le dossier CACHE_DIR.
sortcal : bool
Si 'True', trie le calendrier par ordre chronologique.
Returns Returns
------- -------
str str
@ -143,9 +149,10 @@ def sched_get(date, link, enddate = None, nocache = False) :
finallink = finallink.replace("$YEAR2$", year1) finallink = finallink.replace("$YEAR2$", year1)
if nocache : if nocache :
result = requests.get(finallink).text
if sortcal :
# Utilisation du module 'ics' pour le tri du calendrier dans l'ordre # Utilisation du module 'ics' pour le tri du calendrier dans l'ordre
# chronologique : # chronologique :
result = requests.get(finallink).text
cal = ics.Calendar(result) cal = ics.Calendar(result)
cal.events = sorted(cal.events) cal.events = sorted(cal.events)
result = cal.serialize() result = cal.serialize()
@ -169,6 +176,7 @@ def sched_get(date, link, enddate = None, nocache = False) :
return result return result
else : else :
result = requests.get(finallink).text result = requests.get(finallink).text
if sortcal :
# Utilisation du module 'ics' pour le tri du calendrier dans l'ordre # Utilisation du module 'ics' pour le tri du calendrier dans l'ordre
# chronologique : # chronologique :
cal = ics.Calendar(result) cal = ics.Calendar(result)
@ -209,10 +217,9 @@ def get_depts(filename) :
return dept_list return dept_list
def getrooms(datet, depts, ignore_list) : def get_tot_rooms(datet, depts, ignore_list) :
""" """
Génération de la liste des salles avec heures de début et fin de dispo, Crée une liste de toutes les salles des départements choisis.
et indicateur de dispo.
Parameters Parameters
---------- ----------
@ -220,7 +227,7 @@ def getrooms(datet, depts, ignore_list) :
Date pour la recherche de salles. Date pour la recherche de salles.
depts : list depts : list
Liste des départements dans lesquel chercher des salles. Liste des départements dans lesquels chercher des salles.
ignore_list : list ignore_list : list
Liste des noms de salles à ignorer. Liste des noms de salles à ignorer.
@ -229,14 +236,12 @@ def getrooms(datet, depts, ignore_list) :
------- -------
total_rooms : list total_rooms : list
Liste des salles. Liste des salles.
""" """
total_rooms = list() total_rooms = list()
# Marge de temps (en mois) pour le début du calendrier. # Marge de temps (en mois) pour le début du calendrier.
# Certaines salles ne sont pas utilisées tous les jours, # Certaines salles ne sont pas utilisées tous les jours,
# donc on télécharge l'EDT du reste du mois et du suivant # donc on télécharge l'EDT pour 30 jours.
# pour être tranquille.
margintime = 1 margintime = 1
# Récupération du calendrier de chaque département, # Récupération du calendrier de chaque département,
@ -261,12 +266,10 @@ def getrooms(datet, depts, ignore_list) :
# Parcours de ces calendriers : # Parcours de ces calendriers :
dept_index = 0 dept_index = 0
for cal in cals : for cal in cals :
for comp in cal.walk() : # Événements for comp in cal.walk() : # Composants du calendrier
if comp.name == "VEVENT" : if comp.name == "VEVENT" : # Événements
# Récupération des infos : # Récupération de l'emplacement :
evtloc = str(comp.get("location")) evtloc = str(comp.get("location"))
evtstart = comp.decoded("dtstart")
evtend = comp.decoded("dtend")
# Contient le nom de toutes les salles indiquées # Contient le nom de toutes les salles indiquées
# dans la section "LOCATION" : # dans la section "LOCATION" :
@ -305,6 +308,77 @@ def getrooms(datet, depts, ignore_list) :
depts[dept_index].name depts[dept_index].name
) )
# Réglage du fuseau horaire :
r.start = r.start.astimezone(pytz.timezone(TIMEZONE))
r.end = r.end.astimezone(pytz.timezone(TIMEZONE))
total_rooms.append(r)
dept_index += 1
return total_rooms
def getrooms(datet, depts, ignore_list) :
"""
Ajout des heures de début et fin de dispo aux salles,
et indicateur de dispo.
Parameters
----------
datet : datetime.datetime()
Date pour la recherche de salles.
depts : list
Liste des départements dans lesquel chercher des salles.
ignore_list : list
Liste des noms de salles à ignorer.
Returns
-------
total_rooms : list
Liste des salles.
"""
total_rooms = get_tot_rooms(datet, depts, ignore_list)
# Récupération du calendrier de chaque département :
cals = list() # Liste des EDT des départements choisis
for d in depts :
result = sched_get(datet, d.link, datet, NO_CACHE, True)
cals.append(icalendar.Calendar.from_ical(result))
# cals.append(icalendar.Calendar(result.decode("utf-8")))
# Parcours de ces calendriers :
dept_index = 0
for cal in cals :
for comp in cal.walk() : # Événements
if comp.name == "VEVENT" :
# Récupération des infos :
evtloc = str(comp.get("location"))
evtstart = comp.decoded("dtstart")
evtend = comp.decoded("dtend")
# Contient le nom de toutes les salles indiquées
# dans la section "LOCATION" :
rnamelist = list()
# Séparation des salles multiples, le cas échéant :
if "," in evtloc :
rnamelist = evtloc.split(",")
else :
rnamelist.append(evtloc)
for roomname in rnamelist :
roomname = roomname.strip()
if roomname not in ignore_list :
exists = False
for room in total_rooms :
if room.name == roomname :
exists = True
r = room
if exists :
# Si l'événement se passe aujourd'hui : # Si l'événement se passe aujourd'hui :
if evtstart.day == datet.day and \ if evtstart.day == datet.day and \
evtstart.month == datet.month and \ evtstart.month == datet.month and \
@ -337,11 +411,8 @@ def getrooms(datet, depts, ignore_list) :
r.end = evtstart r.end = evtstart
# Réglage du fuseau horaire : # Réglage du fuseau horaire :
r.start = r.start.astimezone(pytz.timezone('Europe/Paris')) r.start = r.start.astimezone(pytz.timezone(TIMEZONE))
r.end = r.end.astimezone(pytz.timezone('Europe/Paris')) r.end = r.end.astimezone(pytz.timezone(TIMEZONE))
if not exists :
total_rooms.append(r)
dept_index += 1 dept_index += 1