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-25 15:19:14 +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 :
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-24 17:21:25 +01:00
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-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-25 15:19:14 +01:00
def getrooms ( datet , links = [ ] ) :
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-25 15:19:14 +01:00
cals = [ ]
for i in links :
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
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 " :
# 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
2022-02-25 10:51:34 +01:00
2022-02-25 15:19:14 +01:00
# 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 )
2022-02-25 10:51:34 +01:00
return total_rooms