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:
parent
430e8938a2
commit
d79af7ef9b
201
rooms_get.py
201
rooms_get.py
@ -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,12 +149,13 @@ def sched_get(date, link, enddate = None, nocache = False) :
|
|||||||
finallink = finallink.replace("$YEAR2$", year1)
|
finallink = finallink.replace("$YEAR2$", year1)
|
||||||
|
|
||||||
if nocache :
|
if nocache :
|
||||||
# Utilisation du module 'ics' pour le tri du calendrier dans l'ordre
|
|
||||||
# chronologique :
|
|
||||||
result = requests.get(finallink).text
|
result = requests.get(finallink).text
|
||||||
cal = ics.Calendar(result)
|
if sortcal :
|
||||||
cal.events = sorted(cal.events)
|
# Utilisation du module 'ics' pour le tri du calendrier dans l'ordre
|
||||||
result = cal.serialize()
|
# chronologique :
|
||||||
|
cal = ics.Calendar(result)
|
||||||
|
cal.events = sorted(cal.events)
|
||||||
|
result = cal.serialize()
|
||||||
return result
|
return result
|
||||||
else :
|
else :
|
||||||
# Vérifie la TTL :
|
# Vérifie la TTL :
|
||||||
@ -169,11 +176,12 @@ 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
|
||||||
# Utilisation du module 'ics' pour le tri du calendrier dans l'ordre
|
if sortcal :
|
||||||
# chronologique :
|
# Utilisation du module 'ics' pour le tri du calendrier dans l'ordre
|
||||||
cal = ics.Calendar(result)
|
# chronologique :
|
||||||
cal.events = sorted(cal.events)
|
cal = ics.Calendar(result)
|
||||||
result = cal.serialize()
|
cal.events = sorted(cal.events)
|
||||||
|
result = cal.serialize()
|
||||||
with open(cachepath,'w') as f :
|
with open(cachepath,'w') as f :
|
||||||
f.write(result)
|
f.write(result)
|
||||||
return result
|
return 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" :
|
||||||
@ -297,52 +300,120 @@ def getrooms(datet, depts, ignore_list) :
|
|||||||
# de disponibilité est aujourd'hui à 23:59.
|
# de disponibilité est aujourd'hui à 23:59.
|
||||||
# - La salle est libre.
|
# - La salle est libre.
|
||||||
r = Room(roomname,
|
r = Room(roomname,
|
||||||
datet.replace(hour = 0, minute = 0, second = 0),
|
datet.replace(hour = 0, minute = 0, second = 0),
|
||||||
datet.replace(hour = 23, minute = 59, second = 59),
|
datet.replace(hour = 23, minute = 59, second = 59),
|
||||||
True,
|
True,
|
||||||
True,
|
True,
|
||||||
True,
|
True,
|
||||||
depts[dept_index].name
|
depts[dept_index].name
|
||||||
)
|
)
|
||||||
|
|
||||||
# Si l'événement se passe aujourd'hui :
|
# Réglage du fuseau horaire :
|
||||||
if evtstart.day == datet.day and \
|
r.start = r.start.astimezone(pytz.timezone(TIMEZONE))
|
||||||
evtstart.month == datet.month and \
|
r.end = r.end.astimezone(pytz.timezone(TIMEZONE))
|
||||||
evtstart.year == datet.year :
|
|
||||||
# Si l'événement se passe maintenant
|
|
||||||
# (salle occupée maintenant) :
|
|
||||||
if evtstart.timestamp() <= datet.timestamp() and \
|
|
||||||
evtend.timestamp() > datet.timestamp() :
|
|
||||||
r.is_free = False
|
|
||||||
r.nostart = False
|
|
||||||
# L'heure de début de la prochaine dispo est
|
|
||||||
# la fin de l'événement :
|
|
||||||
r.start = evtend
|
|
||||||
# Si l'événement se passe prochainement
|
|
||||||
# (salle occupée à l'occasion de cet événement)
|
|
||||||
# et que le début de l'événement est avant la date
|
|
||||||
# de fin de dispo actuelle (on cherche la date la
|
|
||||||
# plus proche de maintenant) :
|
|
||||||
elif evtstart.timestamp() > datet.timestamp() and \
|
|
||||||
evtstart.timestamp() < r.end.timestamp() :
|
|
||||||
if evtstart.timestamp() == r.start.timestamp() :
|
|
||||||
r.nostart = False
|
|
||||||
# Dans ce cas, l'événement en cours suit
|
|
||||||
# celui qui a défini le début de dispo
|
|
||||||
# de la salle. Alors, c'est la fin de cet
|
|
||||||
# événement qui marque le début de la dispo.
|
|
||||||
r.start = evtend
|
|
||||||
else :
|
|
||||||
r.noend = False
|
|
||||||
r.end = evtstart
|
|
||||||
|
|
||||||
# Réglage du fuseau horaire :
|
|
||||||
r.start = r.start.astimezone(pytz.timezone('Europe/Paris'))
|
|
||||||
r.end = r.end.astimezone(pytz.timezone('Europe/Paris'))
|
|
||||||
|
|
||||||
if not exists :
|
|
||||||
total_rooms.append(r)
|
total_rooms.append(r)
|
||||||
|
|
||||||
dept_index += 1
|
dept_index += 1
|
||||||
|
|
||||||
return total_rooms
|
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 :
|
||||||
|
if evtstart.day == datet.day and \
|
||||||
|
evtstart.month == datet.month and \
|
||||||
|
evtstart.year == datet.year :
|
||||||
|
# Si l'événement se passe maintenant
|
||||||
|
# (salle occupée maintenant) :
|
||||||
|
if evtstart.timestamp() <= datet.timestamp() and \
|
||||||
|
evtend.timestamp() > datet.timestamp() :
|
||||||
|
r.is_free = False
|
||||||
|
r.nostart = False
|
||||||
|
# L'heure de début de la prochaine dispo est
|
||||||
|
# la fin de l'événement :
|
||||||
|
r.start = evtend
|
||||||
|
# Si l'événement se passe prochainement
|
||||||
|
# (salle occupée à l'occasion de cet événement)
|
||||||
|
# et que le début de l'événement est avant la date
|
||||||
|
# de fin de dispo actuelle (on cherche la date la
|
||||||
|
# plus proche de maintenant) :
|
||||||
|
elif evtstart.timestamp() > datet.timestamp() and \
|
||||||
|
evtstart.timestamp() < r.end.timestamp() :
|
||||||
|
if evtstart.timestamp() == r.start.timestamp() :
|
||||||
|
r.nostart = False
|
||||||
|
# Dans ce cas, l'événement en cours suit
|
||||||
|
# celui qui a défini le début de dispo
|
||||||
|
# de la salle. Alors, c'est la fin de cet
|
||||||
|
# événement qui marque le début de la dispo.
|
||||||
|
r.start = evtend
|
||||||
|
else :
|
||||||
|
r.noend = False
|
||||||
|
r.end = evtstart
|
||||||
|
|
||||||
|
# Réglage du fuseau horaire :
|
||||||
|
r.start = r.start.astimezone(pytz.timezone(TIMEZONE))
|
||||||
|
r.end = r.end.astimezone(pytz.timezone(TIMEZONE))
|
||||||
|
|
||||||
|
dept_index += 1
|
||||||
|
|
||||||
|
return total_rooms
|
Loading…
Reference in New Issue
Block a user