UniSquat_Python/rooms_get.py

109 lines
3.5 KiB
Python

#!/usr/bin/env python3
# -*- coding: utf-8 -*-
"""
Created on Thu Feb 24 08:51:58 2022
@author: antoine
"""
################
### UniSquat ###
################
"""
Indique toutes les salles disponibles dans les différents départements de
l'Université de Strasbourg.
"""
# Modules :
import requests
import icalendar
import datetime
# Fonctions :
def room(name,occupied_at,free_at):
"""
Retourne un dico contenant le nom, la prochaine date à laquelle elle est occupée, ainsi que la prochaine date à laquelle elle est libre
Arguments :
name : String
Le nom de la salle
occupied_at : datetime.datetime
La prochaine heure à laquelle elle est occupée
free_at : datetime.datetime
La prochaine heure à laquelle est est libre
Retourne:
Un dico contenant ces trois informations, avec le même nom en clef, en plus de si elle est actuellement libre
"""
return {"name":name,"occupied_at":occupied_at,"free_at":free_at,"free":free_at.timestamp()>occupied_at.timestamp()}
def sched_get(date) :
"""
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.
Parameters
----------
date : datetime.datetime()
Date au format datetime.
Returns
-------
Le texte du résultat de la requête.
"""
day = str(date.day)
month = str(date.month)
year = str(date.year)
r = requests.get("https://adecons.unistra.fr/jsp/custom/modules/plannings/anonymous_cal.jsp?resources=30626&projectId=8&calType=ical&firstDate="+year+"-"+month+"-"+day+"&lastDate="+year+"-"+month+"-"+day)
return r.content
def getrooms(datet) :
"""
Crée une liste de toute les salles, avec des informations si elles sont libres ou non
Parameters
----------
datet : datetime.datetime()
Date au format datetime.
Returns
-------
total_rooms : dico
Dico des salles, indexée par leurs nom.
Toutes les salles mentionnées dans le fichier, avec des informations
"""
# Récupération des informations sur l'EDT téléchargé :
cal = icalendar.Calendar.from_ical(sched_get(datet))
total_rooms = {}
default_hour_margin = 2
for comp in cal.walk():
if comp.name == "VEVENT" :
# Récupération des infos
datestart = comp.decoded("dtstart")
dateend = comp.decoded("dtend")
roomname = str(comp.get("location"))
# 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
# J'enregistre dans le dico
if roomname in total_rooms.keys():
if datestart.timestamp() > total_rooms[roomname]["occupied_at"].timestamp():
datestart = total_rooms[roomname]["occupied_at"]
if dateend.timestamp() > total_rooms[roomname]["free_at"].timestamp():
dateend= total_rooms[roomname]["free_at"]
total_rooms[roomname] = room(roomname,datestart,dateend)
return total_rooms