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 .
2022-02-26 16:39:29 +01:00
occupied_at : datetime . datetime or None
La prochaine heure à laquelle elle est occupée , ou None si salle déjà occupée .
free_at : datetime . datetime or None
La prochaine heure à laquelle est est libre , ou None , si elle est déjà libre .
2022-02-26 15:26:34 +01:00
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
2022-02-26 16:39:29 +01:00
free = False # Indique si la salle est libre ou non
if free_at == None :
free = True
# return {"name":name, "occupied_at":occupied_at, "free_at":free_at, "free":free_at.timestamp() > occupied_at.timestamp()}
return { " name " : name , " occupied_at " : occupied_at , " free_at " : free_at , " free " : free }
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 16:39:29 +01:00
Crée une liste de toutes 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
2022-02-26 16:39:29 +01:00
Dictionnaire des salles , indexées par leur nom .
2022-02-26 15:26:34 +01:00
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 = { }
2022-02-26 16:39:29 +01:00
# default_hour_margin = 2
for cal in cals : # Bâtiments
for comp in cal . walk ( ) : # Événements
2022-02-25 15:19:14 +01:00
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
2022-02-26 16:39:29 +01:00
# Soit l'événement se passe maintenant (salle occupée maintenant) :
if datestart . timestamp ( ) < = datet . timestamp ( ) and dateend . timestamp ( ) > datet . timestamp ( ) :
occupied_at = None
free_at = dateend
total_rooms [ roomname ] = room ( roomname , occupied_at , free_at )
# Soit l'événement se passe prochainement (salle occupée à l'occasion de cet événement) :
elif datestart . timestamp ( ) > datet . timestamp ( ) :
if roomname not in total_rooms . keys ( ) :
occupied_at = datestart
free_at = None
total_rooms [ roomname ] = room ( roomname , occupied_at , free_at )
elif total_rooms [ roomname ] [ " occupied_at " ] != None : # Dans ce cas, il n'y a pas d'événement en cours, donc la salle est libre maintenant
if datestart . timestamp ( ) < total_rooms [ roomname ] [ " occupied_at " ] . timestamp ( ) :
occupied_at = datestart
free_at = None
total_rooms [ roomname ] = room ( roomname , occupied_at , free_at )
# Dans les autres cas, l'événement est passé, donc on l'ignore et on passe au suivant.
# # 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
# Enregistrement dans le dictionnaire :
# Plus nécessaire, car on ne s'occupe plus des événements passés :
# if roomname in total_rooms.keys() :
# if datestart.timestamp() > total_rooms[roomname]["occupied_at"].timestamp() :
# occupied_at = total_rooms[roomname]["occupied_at"]
# if dateend.timestamp() > total_rooms[roomname]["free_at"].timestamp() :
# free_at = total_rooms[roomname]["free_at"]
2022-02-25 10:51:34 +01:00
return total_rooms