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-26 15:26:34 +01:00
def room ( name , occupied_at , free_at ) :
2022-02-25 10:51:34 +01:00
"""
2022-02-26 15:26:34 +01:00
Retourne un dictionnaire contenant le nom , la prochaine date à laquelle elle est occupée , ainsi que la prochaine date à laquelle elle est libre
Parameters
- - - - - - - - - -
name : str
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 .
Returns
- - - - - - -
dict
Un dictionnaire contenant ces trois informations , avec le même nom en clef , en plus de si elle est actuellement libre .
2022-02-25 10:51:34 +01:00
"""
2022-02-26 15:26:34 +01:00
return { " name " : name , " occupied_at " : occupied_at , " free_at " : free_at , " free " : free_at . timestamp ( ) > occupied_at . timestamp ( ) }
2022-02-25 10:51:34 +01:00
2022-02-26 15:26:34 +01:00
def sched_get ( date , link = None ) :
2022-02-24 17:21:25 +01:00
"""
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 .
2022-02-25 15:19:14 +01:00
Optionnels :
link :
2022-02-26 15:26:34 +01:00
Un lien vers lequel effectuer la recherche , des informations seront remplacées :
$ YEAR $ : l ' année
$ MONTH $ : le mois
$ DAY $ : le jour
Par défaut , sera un lien des salles de l ' UFR.
2022-02-25 15:19:14 +01:00
2022-02-24 17:21:25 +01:00
Returns
- - - - - - -
2022-02-26 15:26:34 +01:00
bytes
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-25 15:19:14 +01:00
if not link :
link = " 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 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-25 15:19:14 +01:00
finallink = link . replace ( " $DAY$ " , day )
finallink = finallink . replace ( " $MONTH$ " , month )
finallink = finallink . replace ( " $YEAR$ " , year )
r = requests . get ( finallink )
2022-02-24 18:46:53 +01:00
return r . content
2022-02-24 17:21:25 +01:00
2022-02-26 15:26:34 +01:00
def getrooms ( datet , links = [ ] ) :
2022-02-24 17:21:25 +01:00
"""
2022-02-26 15:26: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-26 15:26:34 +01:00
total_rooms : dict
Dictionnaire 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-25 15:19:14 +01:00
cals = [ ]
for i in links :
2022-02-26 15:26:34 +01:00
cals . append ( icalendar . Calendar . from_ical ( sched_get ( datet ) , link = i ) )
if len ( links ) == 0 : # Par défaut, ne mets pas de lien, ce qui retourne celui de l'UFR
2022-02-25 15:19:14 +01:00
cals = [ icalendar . Calendar . from_ical ( sched_get ( datet ) ) ]
2022-02-24 18:46:53 +01:00
2022-02-25 10:51:34 +01:00
total_rooms = { }
default_hour_margin = 2
2022-02-25 15:19:14 +01:00
for cal in cals :
for comp in cal . walk ( ) :
if comp . name == " VEVENT " :
2022-02-26 15:26:34 +01:00
# Récupération des infos :
2022-02-25 15:19:14 +01:00
datestart = comp . decoded ( " dtstart " )
dateend = comp . decoded ( " dtend " )
roomname = str ( comp . get ( " location " ) )
2022-02-26 15:26:34 +01:00
# 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
2022-02-25 10:51:34 +01:00
2022-02-26 15:26:34 +01:00
# Enregistrement dans le dictionnaire :
2022-02-25 15:19:14 +01:00
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 ( ) :
2022-02-26 15:26:34 +01:00
dateend = total_rooms [ roomname ] [ " free_at " ]
total_rooms [ roomname ] = room ( roomname , datestart , dateend )
2022-02-25 10:51:34 +01:00
return total_rooms