2022-02-24 17:21:25 +01:00
#!/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
2022-02-25 10:51:34 +01:00
import datetime
2022-02-24 17:21:25 +01:00
# Fonctions :
2022-02-25 10:51:34 +01:00
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 ( ) }
2022-02-24 17:21:25 +01:00
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
- - - - - - -
2022-02-24 18:46:53 +01:00
Le texte du résultat de la requête .
2022-02-24 17:21:25 +01:00
"""
2022-02-24 18:46:53 +01:00
2022-02-24 17:21:25 +01:00
day = str ( date . day )
month = str ( date . month )
year = str ( date . year )
2022-02-24 18:46:53 +01:00
2022-02-24 17:21:25 +01:00
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 )
2022-02-24 18:46:53 +01:00
return r . content
2022-02-24 17:21:25 +01:00
2022-02-25 10:51:34 +01:00
def getrooms ( datet ) :
2022-02-24 17:21:25 +01:00
"""
2022-02-25 10:51:34 +01:00
Crée une liste de toute les salles , avec des informations si elles sont libres ou non
2022-02-24 17:21:25 +01:00
Parameters
- - - - - - - - - -
datet : datetime . datetime ( )
Date au format datetime .
Returns
- - - - - - -
2022-02-25 10:51:34 +01:00
total_rooms : dico
Dico des salles , indexée par leurs nom .
Toutes les salles mentionnées dans le fichier , avec des informations
2022-02-24 17:21:25 +01:00
"""
2022-02-24 18:46:53 +01:00
2022-02-24 17:21:25 +01:00
# Récupération des informations sur l'EDT téléchargé :
2022-02-24 18:46:53 +01:00
cal = icalendar . Calendar . from_ical ( sched_get ( datet ) )
2022-02-25 10:51:34 +01:00
total_rooms = { }
default_hour_margin = 2
2022-02-24 18:46:53 +01:00
2022-02-24 17:21:25 +01:00
for comp in cal . walk ( ) :
2022-02-25 10:51:34 +01:00
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