Les statistiques affichent les salles préférées des utilisateurices

This commit is contained in:
theo@manjaro 2022-09-07 19:02:26 +02:00
parent 31aaeca2e2
commit 5330b27e5d
4 changed files with 53 additions and 16 deletions

45
app.py
View File

@ -30,7 +30,8 @@ import rooms_get as ro
# Constantes :
MAX_DEPT = 5 # Le maximum de départements qu'il est possible de sélectionner
MAX_LOG_DAYS = 30 # Le nombre de jours pendant lesquels les logs sont conservés
MAX_LOG_DEPT = 3 # Le nombre maximum affiché de départements qui ont été le plus cherché
MAX_LOG_DEPT = 5 # Le nombre maximum affiché de départements qui ont été le plus cherché
MAX_LOG_FAVS = 10 # Le nombre maximum affiché de salles qui ont été le plus mises en favoris
PING_WARN = 500 # Nombre d'utilisations à partir du quel un message d'avertissement est affiché
LOG_FILE = "log.json" # Contient des stats sur les salles les plus mises en favoris, et les départements
GLOBAL_CONTEXT = {} # Contexte constant pour les templates Jinja
@ -48,7 +49,6 @@ logs = [] # Stoque les différentes requêtes faite sur la route /free_rooms/, s
if os.path.isfile(LOG_FILE):
with open(LOG_FILE,"r") as f:
logs = json.loads(f.read())
print(logs)
# Fonctions :
def save_logs(logs):
@ -111,18 +111,32 @@ def stats():
# Compte le nombre de fois que les différents départements ont été cherchés
pings = 0
counts = {}
counts_favs = {}
def fmap(fav):
return fav[0]+";"+fav[1]
for log in logs:
for dept in log["depts"]:
pings+=1
if dept in counts.keys():
counts[dept]+=1
else:
counts[dept]=1
if log["type"]=="deptcount":
for dept in log["depts"]:
pings+=1
if dept in counts.keys():
counts[dept]+=1
else:
counts[dept]=1
elif log["type"]=="favs":
for fav in log["favs"]:
if fmap(fav) in counts_favs.keys():
counts_favs[fmap(fav)][2] += 1
else:
fav.append(1)
counts_favs[fmap(fav)]=fav
sort = [ [x,counts[x]] for x in counts.keys() ]
sort.sort(key = lambda x: x[1],reverse = True ) # Trie selon la valeur du deuxieme élément de la liste
sort_favs = [ counts_favs[x] for x in counts_favs.keys() ]
sort_favs.sort(key = lambda x: x[2],reverse = True )
context = {"MAX_LOG_DAYS":MAX_LOG_DAYS,"PING_WARN":PING_WARN,"depts":sort[:MAX_LOG_DEPT],"nbping":pings}
context = {"MAX_LOG_DAYS":MAX_LOG_DAYS,"PING_WARN":PING_WARN,"depts":sort[:MAX_LOG_DEPT],"favs":sort_favs[:MAX_LOG_FAVS],"nbping":pings}
return render_template("stats.html",**context, **GLOBAL_CONTEXT)
@ -284,14 +298,23 @@ def free_rooms() :
"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) :
ctimestamp = dti.datetime.now().timestamp()
log = {}
log["timestamp"] = dti.datetime.now().timestamp()
log["timestamp"] = ctimestamp
log["depts"] = [ x.name for x in depts ] # Liste les noms de départements
log["type"] = "deptcount" # Type du log
logs.append(log)
# Création d'un log de la date et des salles favorites
favs = favs_soon_rooms+favs_free_rooms
if len(favs)>0:
log = {}
log["timestamp"] = ctimestamp
log["favs"] = [ [x.name,x.dept_name] for x in favs] # Liste les noms des salles favorites
log["type"] = "favs" # Type du log
logs.append(log)
# Suppression des logs vieux de MAX_LOG_DAYS :
while (log["timestamp"] - logs[0]["timestamp"]) / (60*60*24) > MAX_LOG_DAYS :
while (ctimestamp - logs[0]["timestamp"]) / (60*60*24) > MAX_LOG_DAYS :
del(logs[0])
# Sauvegarde les logs dans un fichier cache

View File

@ -49,13 +49,17 @@ class Room :
id : string
Identifiant 'unique' (avec un très faible risque de conflit) de la salle (généré à partir de son nom)
dept_name : string
Le nom du département auquel la salle appartient
"""
def __init__(self, name, start, end, is_free) :
def __init__(self, name, start, end, is_free, dept_name="DEFAULT DEPT") :
self.name = name
self.start = start
self.end = end
self.is_free = is_free
self.id = self.getId(name)
self.dept_name = dept_name
def getId(self,name):
random.seed(name)

View File

@ -241,6 +241,7 @@ def get_tot_rooms(datet, depts, ignore_list) :
roomnames = [] # Contient le nom de toutes les salles indiquées dans la section "LOCATION"
# Parcours de ces calendriers, pour faire la liste de toutes les salles :
dept_index = 0
for cal in cals :
for comp in cal.walk() : # Événements
if comp.name == "VEVENT" :
@ -268,8 +269,9 @@ def get_tot_rooms(datet, depts, ignore_list) :
start = start.astimezone(pytz.timezone('Europe/Paris'))
end = end.astimezone(pytz.timezone('Europe/Paris'))
total_rooms.append(Room(rname, start, end, is_free))
total_rooms.append(Room(rname, start, end, is_free, depts[dept_index].name))
dept_index += 1
return total_rooms

View File

@ -9,18 +9,26 @@
<body>
{% include "base.html" %}
<main>
<h1>Statistiques d'utilisation du site</h1>
<h1><span aria-hidden="true">🔢 </span>Statistiques d'utilisation du site</h1>
<p>Ces {{MAX_LOG_DAYS}} derniers jours, des salles ont été recherchées {{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>
{% endif %}
{% if depts != [] : %}
<h1>Départements les plus recherchés</h1>
<h1><span aria-hidden="true">🏫 </span>Départements les plus recherchés</h1>
<ul>
{% for dept in depts: %}
<li><strong>{{ dept[0] }}</strong> (recherché {{dept[1]}} fois)</li>
{% endfor %}
</ul>
{% endif %}
{% if favs != [] : %}
<h1><span aria-hidden="true"></span>Salles préférées des utilisateurices</h1>
<ul>
{% for fav in favs: %}
<li><strong>{{ fav[0] }}</strong> ({{fav[1]}}, recherchée {{fav[2]}} fois)</li>
{% endfor %}
</ul>
{% endif %}
</main>
{% include "footer.html" %}