Compare commits

..

No commits in common. "80b2db7481df5e74617ac504225fe2772c475d52" and "17df0e900cf8fa9c72d9dfcf8a509fb7488f50cf" have entirely different histories.

11 changed files with 121 additions and 175 deletions

View File

@ -1,22 +1,21 @@
# UniSquat
Une application pour trouver rapidement les salles disponibles dans l'Université de Strasbourg.
C'est utile aux élèves qui cherchent un coin pour travailler ou manger, comme aux enseignants en détresse à cause d'un changement de salle imprévu.
Cela vous permet par exemple, si vous êtes élève, de chercher un endroit pour travailler, ou si vous êtes enseignant, de trouver une salle libre en cas de changement d'emploi du temps.
Cette application dispose d'une interface Web fonctionnant avec Flask. Une instance de cette application est disponible en ligne [ici][homepage].
Cette application dispose d'une interface Web fonctionnant avec Flask. Une version en ligne est disponible [ici][homepage].
## Fonctionnalités
- 🔎 Visualiser les salles libres de plusieurs départements en même temps (par exemple : l'UFR de Math-Info et l'EOST).
- ⏰ Connaître la période de disponibilité d'une salle.
- 🔜 Les salles prochainement libres sont également affichées, avec leur prochaine disponibilité.
- 🔜 Les salles prochainement libres sont également affichées, avec l'heure de début de disponibilité.
- ⭐ Marquer des salles comme favorites, pour les afficher en haut de la page.
* Les favoris sont stockés dans l'URL de la page. Cela permet de les partager ou de les enregistrer simplement, puisqu'il suffit de partager l'URL ou de l'ajouter aux marque-pages.
* Les favoris sont stockés dans l'URL de la page. Cela permet de le partager simplement, puisqu'il suffit de partager l'URL
* 📅 Rechercher les salles libres à une date précise.
- 🪶 Application légère pour l'utilisateur :
* Pas de JavaScript, tous les calculs sont faits coté serveur.
* Pas de *Local Storage*, *cookies* ou autres *bibliothèques CSS*.
* Pas de JavaScript, tout les calculs sont fait coté serveur
* Pas de *Local Storage*, *Cookies* ou autres *bibliothèques CSS*
## Dépendances
@ -33,7 +32,7 @@ Vous pouvez aussi installer directement les dépendances avec cette commande :
pip install -r requirements.txt
```
## Comment lancer l'interface Web (Flask)
## Comment lancer la version Web (Flask)
Dans la racine du dossier :
@ -41,21 +40,23 @@ Dans la racine du dossier :
flask run
```
C'est l'interface qui est activement supportée. N'hésitez pas à héberger votre propre instance d'UniSquat.
C'est la version la plus utilisable, n'hésitez pas à héberger votre propre version.
## Interfaces obsolètes
Ces interfaces ont été crées à des fins de test. Elles ne sont plus mises à jour, et peuvent être instables.
Ces interfaces ont été crées à des fins de test. Elles peuvent être instables, et ne sont plus mises à jour.
### Interface en ligne de commande
Une interface en ligne de commande est disponible. Elle ne nécessite pas de dépendances supplémentaires.
Pour la lancer :
```python
python main_cli.py
```
### Interface graphique (Qt5)
### Interface Qt5
Une interface graphique utilisant la bibliothèque Qt. Elle nécessite le module `PyQt5`.

71
app.py
View File

@ -128,27 +128,29 @@ def free_rooms() :
flask.render_template
"""
# Récupération des ID des départements depuis le formulaire :
dident_list = list(request.args.getlist("dept"))
if len(dident_list) > MAX_DEPT :
dident_list = request.args.getlist("dept")
if len(dident_list)>MAX_DEPT:
return render_template("error.html", error="Trop de départements sélectionnés ! Vous pouvez en sélectionner "+str(MAX_DEPT)+" au maximum.")
if len(dident_list) == 0 :
if len(dident_list)==0:
return render_template("error.html", error="Il faut choisir au moins un département !")
# Récupération de l'éventuelle date personnalisée (depuis la page de sélection de date) :
date_uf = str(request.args.get("date"))
date_uf_sav = date_uf
if date_uf == "None" :
date_uf = request.args.get("date")
if date_uf == None :
date_uf = [""]
else :
date_uf = date_uf.split("-")
time_uf = str(request.args.get("time"))
time_uf_sav = time_uf
if time_uf == "None" :
time_uf = request.args.get("time")
if time_uf == None :
time_uf = [""]
else :
time_uf = time_uf.split(":")
# Récupére les IDs des salles favorites
favs_ids = request.args.getlist("favs")
if favs_ids == None:
favs_ids = []
date = dti.datetime.now()
@ -161,21 +163,15 @@ def free_rooms() :
if time_uf != [""] :
date = date.replace(hour = int(time_uf[0]), minute = int(time_uf[1]))
date_str += ", à " + time_uf[0] + ":" + time_uf[1]
# Récupération des IDs des salles favorites :
favs_ids = list(request.args.getlist("favs"))
if favs_ids == [None] :
favs_ids = []
# Récupération de la liste des départements existants :
# Récupération de la liste des départements :
dept_filen = "data/dept_list.txt"
dept_list = ro.get_depts(dept_filen)
# Vérification qu'il n'y a pas de mauvais départements demandés :
for d in dident_list :
try :
# Vérifie qu'il n'y a pas de mauvais départements demandés :
for d in dident_list:
try:
int(d)
except:
return render_template("error.html", error="Identifiant de département invalide !", **GLOBAL_CONTEXT)
@ -198,10 +194,9 @@ def free_rooms() :
ignore_list = ["salle non définie", "salle en Distanciel"]
free_rooms = ro.getrooms(date, depts, ignore_list)
# Création d'un dictionnaire avec les infos des salles :
frooms_disp = dict() # Mise en forme des infos pour la page Web
i = 0
for r in free_rooms :
remain_time_str = ""
@ -214,8 +209,7 @@ def free_rooms() :
"end":date_tools.hour_disp(r.end),
"rtime":remain_time_str}
# Ajout des arguments favoris, et départements à l'URL :
change_date_str = "?"
i = 0
if favs_ids != [] :
@ -225,7 +219,7 @@ def free_rooms() :
if i < len(favs_ids) - 1:
change_date_str += "&"
i+=1
change_date_str += "&"
change_date_str += "&"
for v in dident_list:
change_date_str += "dept="+str(v)
if i<len(dident_list)-1:
@ -233,20 +227,13 @@ def free_rooms() :
i+=1
# Génération du lien pour enlever les favoris séléctionnés :
# Générer le lien pour enlever les favoris séléctionnés
nofavslink = "/app/free-rooms?"
for dept in dident_list:
nofavslink+="dept="+str(dept)+"&"
# Ajout des éventuels date et heure :
if date_uf_sav != "None" :
nofavslink += "date=" + date_uf_sav + "&"
if time_uf_sav != "None" :
nofavslink += "time=" + time_uf_sav
# Suppression de l'éventuel '&' en trop :
if nofavslink[:-1] == "&" :
nofavslink = nofavslink[:-1]
nofavslink = nofavslink[:-1] # Enlever le dernier &
# Tri des salles selon leurs catégories :
# Trier les salles selon leurs catégories
favs_free_rooms = []
favs_soon_rooms = []
soon_rooms = []
@ -258,17 +245,15 @@ def free_rooms() :
context = {"favs_free_rooms":favs_free_rooms, "favs_soon_rooms":favs_soon_rooms,
"free_rooms":final_rooms, "soon_rooms":soon_rooms, "frooms_disp":frooms_disp,
"depts_str":depts_str, "dident_list":dident_list, "date_str":date_str,
"date_uf_sav":date_uf_sav, "time_uf_sav":time_uf_sav, "change_date_str":change_date_str,
"favs":len(favs_ids)>0,"nofavslink":nofavslink}
"change_date_str":change_date_str, "favs":len(favs_ids)>0,"nofavslink":nofavslink}
# Création d'un log de la date et des départements demandés (pour les stats du site) :
# Crée un log de la date et des départements demandés ( pour des futures statistiques )
log = {}
log["timestamp"] = dti.datetime.now().timestamp()
log["depts"] = depts
logs.append(log)
# Suppression des logs vieux de MAX_LOG_DAYS :
while (log["timestamp"] - logs[0]["timestamp"]) / (60*60*24) > MAX_LOG_DAYS :
# Vide les logs vieux de MAX_LOG_DAYS
while (log["timestamp"]-logs[0]["timestamp"])/(60*60*24)>MAX_LOG_DAYS:
del(logs[0])
url_for("static", filename="style.css")
@ -289,8 +274,8 @@ def date_select() :
-------
flask.render_template
"""
dident_list = list(request.args.getlist("dept"))
favs_ids = list(request.args.getlist("favs"))
dident_list = request.args.getlist("dept")
favs_ids = request.args.getlist("favs")
context = {"dident_list":dident_list, "favs_ids":favs_ids}

View File

@ -1,122 +1,122 @@
UFR de Mathématiques-Informatique
30626
https://adecons.unistra.fr/jsp/custom/modules/plannings/anonymous_cal.jsp?resources=30626&projectId=8&calType=ical
EOST - École et Observatoire des Sciences de la Terre
30773
https://adecons.unistra.fr/jsp/custom/modules/plannings/anonymous_cal.jsp?resources=30773&projectId=8&calType=ical
Atrium
5208
https://adecons.unistra.fr/jsp/custom/modules/plannings/anonymous_cal.jsp?resources=5208&projectId=8&calType=ical
Escarpe
336
https://adecons.unistra.fr/jsp/custom/modules/plannings/anonymous_cal.jsp?resources=336&projectId=8&calType=ical
Faculté de Chimie
336
https://adecons.unistra.fr/jsp/custom/modules/plannings/anonymous_cal.jsp?resources=336&projectId=8&calType=ical
Faculté de Droit
304
https://adecons.unistra.fr/jsp/custom/modules/plannings/anonymous_cal.jsp?resources=304&projectId=8&calType=ical
I.P.C.B
30695
https://adecons.unistra.fr/jsp/custom/modules/plannings/anonymous_cal.jsp?resources=30695&projectId=8&calType=ical
Institut Le Bel
5188
https://adecons.unistra.fr/jsp/custom/modules/plannings/anonymous_cal.jsp?resources=5188&projectId=8&calType=ical
Le Portique
8824
https://adecons.unistra.fr/jsp/custom/modules/plannings/anonymous_cal.jsp?resources=8824&projectId=8&calType=ical
Pangloss
4480
https://adecons.unistra.fr/jsp/custom/modules/plannings/anonymous_cal.jsp?resources=4480&projectId=8&calType=ical
Patio
4484
https://adecons.unistra.fr/jsp/custom/modules/plannings/anonymous_cal.jsp?resources=4484&projectId=8&calType=ical
Plateforme de biologie
5333
https://adecons.unistra.fr/jsp/custom/modules/plannings/anonymous_cal.jsp?resources=5333&projectId=8&calType=ical
Athena
33171
https://adecons.unistra.fr/jsp/custom/modules/plannings/anonymous_cal.jsp?resources=33171&projectId=8&calType=ical
Collège Doctoral Européen
22444
https://adecons.unistra.fr/jsp/custom/modules/plannings/anonymous_cal.jsp?resources=22444&projectId=8&calType=ical
M.I.S.H.A
4472
https://adecons.unistra.fr/jsp/custom/modules/plannings/anonymous_cal.jsp?resources=4472&projectId=8&calType=ical
MDP - Maison des personnels
39466
https://adecons.unistra.fr/jsp/custom/modules/plannings/anonymous_cal.jsp?resources=39466&projectId=8&calType=ical
Présidence
10310
https://adecons.unistra.fr/jsp/custom/modules/plannings/anonymous_cal.jsp?resources=10310&projectId=8&calType=ical
Faculté de Géographie
30614
https://adecons.unistra.fr/jsp/custom/modules/plannings/anonymous_cal.jsp?resources=30614&projectId=8&calType=ical
Faculté de Psychologie
30612
https://adecons.unistra.fr/jsp/custom/modules/plannings/anonymous_cal.jsp?resources=30612&projectId=8&calType=ical
Institut botanique
5144
https://adecons.unistra.fr/jsp/custom/modules/plannings/anonymous_cal.jsp?resources=5144&projectId=8&calType=ical
Institut de Physique
30597
https://adecons.unistra.fr/jsp/custom/modules/plannings/anonymous_cal.jsp?resources=30597&projectId=8&calType=ical
Institut de Zoologie
30696
https://adecons.unistra.fr/jsp/custom/modules/plannings/anonymous_cal.jsp?resources=30696&projectId=8&calType=ical
Palais universitaire
4474
https://adecons.unistra.fr/jsp/custom/modules/plannings/anonymous_cal.jsp?resources=4474&projectId=8&calType=ical
Médecine
10172
https://adecons.unistra.fr/jsp/custom/modules/plannings/anonymous_cal.jsp?resources=10172&projectId=8&calType=ical
Dentaire
25353
https://adecons.unistra.fr/jsp/custom/modules/plannings/anonymous_cal.jsp?resources=25353&projectId=8&calType=ical
Cardo
7429
https://adecons.unistra.fr/jsp/custom/modules/plannings/anonymous_cal.jsp?resources=7429&projectId=8&calType=ical
Ensemble Saint Georges
311
https://adecons.unistra.fr/jsp/custom/modules/plannings/anonymous_cal.jsp?resources=311&projectId=8&calType=ical
Galiléo
50
https://adecons.unistra.fr/jsp/custom/modules/plannings/anonymous_cal.jsp?resources=50&projectId=8&calType=ical
C.R.L - Pôle Lansad
11715
https://adecons.unistra.fr/jsp/custom/modules/plannings/anonymous_cal.jsp?resources=11715&projectId=8&calType=ical
École de Management
30694
https://adecons.unistra.fr/jsp/custom/modules/plannings/anonymous_cal.jsp?resources=30694&projectId=8&calType=ical
Faculté des Sciences Économiques et de Gestion
96
https://adecons.unistra.fr/jsp/custom/modules/plannings/anonymous_cal.jsp?resources=96&projectId=8&calType=ical
Institut Mécanique des Fluides
30594
https://adecons.unistra.fr/jsp/custom/modules/plannings/anonymous_cal.jsp?resources=30594&projectId=8&calType=ical
INSPÉ Colmar
30622
https://adecons.unistra.fr/jsp/custom/modules/plannings/anonymous_cal.jsp?resources=30622&projectId=8&calType=ical
E.C.P.M - Cronenbourg
316
https://adecons.unistra.fr/jsp/custom/modules/plannings/anonymous_cal.jsp?resources=316&projectId=8&calType=ical
ENGEES
30705
https://adecons.unistra.fr/jsp/custom/modules/plannings/anonymous_cal.jsp?resources=30705&projectId=8&calType=ical
IUT Hagenau
30607
https://adecons.unistra.fr/jsp/custom/modules/plannings/anonymous_cal.jsp?resources=30607&projectId=8&calType=ical
EOST - Rue Blessig
30633
https://adecons.unistra.fr/jsp/custom/modules/plannings/anonymous_cal.jsp?resources=30633&projectId=8&calType=ical
Goethe 43
9899
https://adecons.unistra.fr/jsp/custom/modules/plannings/anonymous_cal.jsp?resources=9899&projectId=8&calType=ical
IUT Louis Pasteur
30619
https://adecons.unistra.fr/jsp/custom/modules/plannings/anonymous_cal.jsp?resources=30619&projectId=8&calType=ical
INSPÉ Séléstat
30600
https://adecons.unistra.fr/jsp/custom/modules/plannings/anonymous_cal.jsp?resources=30600&projectId=8&calType=ical
4, rue Boussingault
30593
https://adecons.unistra.fr/jsp/custom/modules/plannings/anonymous_cal.jsp?resources=30593&projectId=8&calType=ical
7, rue de l'Université
5166
https://adecons.unistra.fr/jsp/custom/modules/plannings/anonymous_cal.jsp?resources=5166&projectId=8&calType=ical
Boulevard Lefebvre S.F.C. (ex. IPST)
8108
https://adecons.unistra.fr/jsp/custom/modules/plannings/anonymous_cal.jsp?resources=8108&projectId=8&calType=ical
INSPÉ Meinau (nouveau bâtiment)
30605
https://adecons.unistra.fr/jsp/custom/modules/plannings/anonymous_cal.jsp?resources=30605&projectId=8&calType=ical
INSPÉ Neudorf (école annexe)
98
https://adecons.unistra.fr/jsp/custom/modules/plannings/anonymous_cal.jsp?resources=98&projectId=8&calType=ical
S.F.C.
30665
https://adecons.unistra.fr/jsp/custom/modules/plannings/anonymous_cal.jsp?resources=30665&projectId=8&calType=ical
IUT Informatique - Illkirch
30678
https://adecons.unistra.fr/jsp/custom/modules/plannings/anonymous_cal.jsp?resources=30678&projectId=8&calType=ical
IUT Leonardo - Illkirch
30610
https://adecons.unistra.fr/jsp/custom/modules/plannings/anonymous_cal.jsp?resources=30610&projectId=8&calType=ical
IUT Génie Civil - Illkirch
30667
https://adecons.unistra.fr/jsp/custom/modules/plannings/anonymous_cal.jsp?resources=30667&projectId=8&calType=ical&
IUT Chimie - Illkirch
30661
https://adecons.unistra.fr/jsp/custom/modules/plannings/anonymous_cal.jsp?resources=30661&projectId=8&calType=ical
IUT - Bloc Central - Illkirch
30658
https://adecons.unistra.fr/jsp/custom/modules/plannings/anonymous_cal.jsp?resources=30658&projectId=8&calType=ical
ISU - Ext - Illkirch
209
https://adecons.unistra.fr/jsp/custom/modules/plannings/anonymous_cal.jsp?resources=209&projectId=8&calType=ical
Faculté de Pharmacie - Illkirch
5095
https://adecons.unistra.fr/jsp/custom/modules/plannings/anonymous_cal.jsp?resources=5095&projectId=8&calType=ical
Bibliothèque IUT Pharmacie - Illkirch
37765
https://adecons.unistra.fr/jsp/custom/modules/plannings/anonymous_cal.jsp?resources=37765&projectId=8&calType=ical
API - Bâtiment A (central) - Illkirch
30602
https://adecons.unistra.fr/jsp/custom/modules/plannings/anonymous_cal.jsp?resources=30602&projectId=8&calType=ical
API - Bâtiment B (télécom) - Illkirch
18442
https://adecons.unistra.fr/jsp/custom/modules/plannings/anonymous_cal.jsp?resources=18442&projectId=8&calType=ical
API - Bâtiment C (télécom) - Illkirch
30653
https://adecons.unistra.fr/jsp/custom/modules/plannings/anonymous_cal.jsp?resources=30653&projectId=8&calType=ical
API - Bâtiment D (ESBS) - Illkirch
30634
https://adecons.unistra.fr/jsp/custom/modules/plannings/anonymous_cal.jsp?resources=30634&projectId=8&calType=ical
API - Bâtiment E (CEBGS) - Illkirch
30651
https://adecons.unistra.fr/jsp/custom/modules/plannings/anonymous_cal.jsp?resources=30651&projectId=8&calType=ical
API - Bâtiment I (laboratoire SERTIT) - Illkirch
19336
https://adecons.unistra.fr/jsp/custom/modules/plannings/anonymous_cal.jsp?resources=19336&projectId=8&calType=ical
API - Bâtiment J (hall techno) - Illkirch
30688
https://adecons.unistra.fr/jsp/custom/modules/plannings/anonymous_cal.jsp?resources=30688&projectId=8&calType=ical

View File

@ -86,8 +86,5 @@ class Dept :
def __init__(self, ident, name, link, rooms) :
self.ident = ident
self.name = name
self.link = self.genlink(link)
self.link = link
self.rooms = rooms
def genlink(self,link):
return "https://adecons.unistra.fr/jsp/custom/modules/plannings/anonymous_cal.jsp?resources="+link.strip()+"&projectId=8&calType=ical"

View File

@ -1,13 +0,0 @@
#!/bin/bash
# Ce script permet d'envoyer l'application sur le serveur
scp -r data unisquat@ssh-unisquat.alwaysdata.net:www/flask
scp -r static unisquat@ssh-unisquat.alwaysdata.net:www/flask
scp -r templates unisquat@ssh-unisquat.alwaysdata.net:www/flask
scp app.py unisquat@ssh-unisquat.alwaysdata.net:www/flask
scp date_tools.py unisquat@ssh-unisquat.alwaysdata.net:www/flask
scp objects.py unisquat@ssh-unisquat.alwaysdata.net:www/flask
scp rooms_get.py unisquat@ssh-unisquat.alwaysdata.net:www/flask
ssh unisquat@ssh-unisquat.alwaysdata.net

View File

@ -32,8 +32,7 @@ from objects import Dept
# Constantes :
CACHE_DIR = "cache"
CACHE_TTL = 5 # Intervalle de temps entre les réinitialisations du cache, en minutes
CACHE_SIZE = 10 # Nombres maximum de fichier dans le cache
CACHE_TTL = 3 # Intervalle de temps entre les réinitialisations du cache, en minutes
# Globales
last_cache_init = -999
@ -143,9 +142,6 @@ def sched_get(date, link, enddate = None, nocache = False) :
elapsed = time.time() - last_cache_init
if elapsed>CACHE_TTL*60:
reinit_cache()
# Vérifie que le nombre total de fichiers dans le cache n'est pas dépassé
if len(os.listdir(CACHE_DIR))>CACHE_SIZE:
reinit_cache()
# Vérifie que le lien est dans le cache
cachepath = os.path.join(CACHE_DIR,trim(finallink))

View File

@ -10,7 +10,7 @@
{% include "base.html" %}
<main>
<form action="/app/free-rooms" method="get">
<div class="flex"><p>Choisisssez une date :</p></div>
<div class="flex"><p>Choisisssez une date</p></div>
<div class="flex">
<input type="date" id="froom-date" name="date"/>
</div>
@ -20,7 +20,6 @@
<div class="flex">
<input type="submit" value="Valider">
</div>
<!-- Magie noire pour conserver les départements et favoris séléctionnés (FIXME !!!!) -->
{% for d in dident_list : %}
<span style="display: none;"><input type="text" name="dept" value="{{ d }}"/></span>
{% endfor %}

View File

@ -9,7 +9,7 @@
<body>
{% include "base.html" %}
<main>
<div class="flex"><p>Sélectionnez des départements dans la liste :</p></div>
<div class="flex"><p>Sélectionnez des départements dans la liste</p></div>
<form action="/app/free-rooms" method="get">
<div class="flex">
<input type="submit" value="Valider">

View File

@ -21,7 +21,7 @@
{% endif %}
</div>
<div class="flex" style="margin: 10px">
<a class="button" href='/app/date-select{{ change_date_str }}'>Choisir une date</a>
<a class="button" href='/app/date-select{{change_date_str}}'>Choisir une date</a>
</div>
{% if favs: %}
<div class="flex" style="margin: 10px">
@ -29,9 +29,9 @@
</div>
{% endif %}
<form action="/app/free-rooms" method="get">
<div class="flex" style="margin: 10px">
<input style="font-size: 16px;" type="submit" value="Enregistrer les favoris">
</div>
<div class="flex" style="margin: 10px">
<input style="font-size: 16px;" type="submit" value="Enregistrer les favoris">
</div>
{% if favs: %}
<div class="flex-pc">
{% if favs_free_rooms|length>0: %}
@ -143,12 +143,9 @@
{% endif %}
</div>
<div class="flex">
<!-- Magie noire pour conserver les départements et date-heure séléctionnés (FIXME !!!!) -->
{% for d in dident_list : %}
<span style="display: none;"><input type="text" name="dept" value="{{ d }}"/></span>
{% endfor %}
<span style="display: none;"><input type="text" name="date" value="{{ date_uf_sav }}"/></span>
<span style="display: none;"><input type="text" name="time" value="{{ time_uf_sav }}"/></span>
{% for d in dident_list : %} <!-- Magie noire pour conserver les départements séléctionnés -->
<span style="display: none;"><input type="text" name="dept" value="{{ d }}"/></span>
{% endfor %}
</div>
</form>
</main>

View File

@ -18,26 +18,10 @@
UniSquat est une application qui permet de trouver des salles libres à l'Université de Strasbourg. Sélectionnez des départements de l'université, et les salles de ces départements qui sont libres, et prochainement libres, s'afficheront.<br>
Cela vous permet par exemple, si vous êtes élève, de chercher un endroit pour travailler, ou si vous êtes enseignant, de trouver une salle libre en cas de changement d'emploi du temps.
</p>
<h2>Fonctionnalités</h2>
<ul>
<li>🔎 Visualiser les salles libres de plusieurs départements en même temps (par exemple : l'UFR de Math-Info et l'EOST).</li>
<li>⏰ Connaître la période de disponibilité d'une salle.</li>
<li>🔜 Les salles prochainement libres sont également affichées, avec leur prochaine disponibilité.</li>
<li>⭐ Marquer des salles comme favorites, pour les afficher en haut de la page.</li>
<ul>
<li>Les favoris sont stockés dans l'URL de la page. Cela permet de les partager ou de les enregistrer simplement, puisqu'il suffit de partager l'URL ou de l'ajouter aux marque-pages.</li>
</ul>
<li>📅 Rechercher les salles libres à une date choisie.</li>
<li>🪶 Application légère pour l'utilisateur :</li>
<ul>
<li>Pas de JavaScript, tous les calculs sont faits coté serveur.</li>
<li>Pas de <i>Local Storage</i>, <i>cookies</i> ou autres <i>bibliothèques CSS</i>.</li>
</ul>
</ul>
<h2>Comment ça marche ?</h2>
<p>L'Université de Strasbourg met à disposition l'emploi du temps des salles en ligne, et permet de télécharger ces emplois du temps sous la forme d'un fichier ICalendar. UniSquat télécharge les fichiers en lien avec le(s) département(s) sélectionné(s), les met en commun, et les analyse pour trouver des salles libres et les afficher.</p>
<h2>Et c'est développé par qui ?</h2>
<p><a href="{{CREDITSLINK}}">{{CREDITSNAME}}</a>, une organisation de deux étudiants. Le code source est disponible <a href="{{SOURCE}}">ici</a> :)</p>
<h2>Comment ça marche ?</h2>
<p>L'Université de Strasbourg met à disposition l'emploi du temps des salles en ligne, et permet de télécharger ces emplois du temps sous la forme d'un fichier ICalendar. UniSquat télécharge les fichiers en lien avec le(s) département(s) sélectionné(s), les met en commun, et les analyse pour trouver des salles libres et les afficher.</p>
<h2>Et c'est développé par qui ?</h2>
<p><a href="{{CREDITSLINK}}">{{CREDITSNAME}}</a>, une organisation de deux étudiants. Le code source est disponible <a href="{{SOURCE}}">ici</a> :)</p>
</main>
{% include "footer.html" %}
</body>

View File

@ -9,15 +9,15 @@
<body>
{% include "base.html" %}
<main>
<h1>Statistiques d'utilisation du site</h1>
<p>Ces {{MAX_LOG_DAYS}} derniers jours, des salles ont été recherchées {{nbping}} fois.</p>
<h1>Statistiques d'utilisation de l'instance</h1>
<p>Ces {{MAX_LOG_DAYS}} derniers jours, cette instance a recherché des salles {{nbping}} fois !</p>
{% if nbping>PING_WARN %}
<p>⚠ Ce site commence a être <strong>surchargé</strong> ! N'hésitez pas à héberger votre propre instance d'UniSquat :) <a href="https://forge.chapril.org/Wantoo/UniSquat_Python">En savoir plus</a></p>
<p>⚠ L'instance commence a être <strong>surchargée</strong>, considérez le fait d'en <a href="https://forge.chapril.org/Wantoo/UniSquat_Python">créer une vous même</a></p>
{% endif %}
<h1>Départements les plus recherchés</h1>
<h1>Départements les plus demandés</h1>
<ul>
{% for dept in depts: %}
<li><strong>{{ dept[0] }}</strong> (recherché {{dept[1]}} fois)</li>
<li><strong>{{ dept[0] }}</strong> (demandé {{dept[1]}} fois)</li>
{% endfor %}
</ul>
</main>