#!/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() 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