Application Flask pour suivre la qualité des masterclasses et des animateurs : tableaux de bord, leaderboards (tout temps & 30 jours), recherche par rôle, récap Slack, et affichage stylisé des avis négatifs. Elle inclut également un module de réévaluation du temps des exercices.
- Authentification globale partagée : une seule connexion Nexus déverrouille l'application pour tous les utilisateurs, de façon permanente
- Navbar Bootstrap avec lien vers le module de réévaluation
- Dashboard :
- Wall of Fame / Wall of Not Fame
- Commentaires négatifs formatés, avec liens Meeting & User
- Animateurs :
- Liste groupée par Rôle (+ recherche par nom)
- Page détail animateur (stats globales & 30 jours)
- Masterclasses :
- Liste de masterclasses cliquables
- Page détail MC (stats globales & 30 jours)
- Leaderboards (2 colonnes configurables) :
- Animateurs / 30 jours / Masterclasses / 30 jours
- Slider du seuil minimal de sessions (une session = Meeting ID unique)
- Slack Bot :
- 3 boutons pour envoyer les récap (Top, Not Top, Commentaires négatifs)
- Récap hebdomadaire automatique des commentaires négatifs, le lundi à 05:00
(heure de Paris). Le créneau est revérifié chaque jour à 05:00 et au
démarrage de l'app : un envoi manqué (API Nexus indisponible, conteneur
arrêté) est rattrapé, et l'horodatage
data/last_weekly_report.txtgarantit un seul envoi par semaine.
- Time Reevaluation (Time Reeval) :
- Comparaison du temps recommande et reel pour les exercices
- Ajout de sources de donnees par User ID ou Cohort ID
- Chargement rapide de cohortes echantillons predefinies
- Graphiques interactifs et table de details triable
- Identifiants chiffrés au repos : les identifiants Nexus partagés sont stockés chiffrés (Fernet) dans
data/credentials.json. La clé vient de la variable d'environnementCREDENTIALS_KEY(générée automatiquement et ajoutée au.envsi absente). Un ancien fichier en clair est migré automatiquement à la première lecture. - Reverse proxy nginx : seul nginx est exposé publiquement ; l'app Flask n'est joignable que via le réseau interne Docker. Par défaut en HTTP (
deploy/nginx.http.conf) ; avec un domaine + certificat, passer surdeploy/nginx.confetENFORCE_HTTPS=truepour forcer HTTPS + HSTS (voir DEPLOYMENT.md). - Anti-brute-force : le formulaire de connexion est limité à 5 tentatives/minute par IP (Flask-Limiter), les POST d'actualisation à 10/minute.
- Messages d'erreur génériques : les détails d'erreurs (traceback, chemins) ne sont jamais renvoyés au navigateur ; ils sont écrits dans
logs/app.log(make logs). L'utilisateur voit une page d'erreur expliquant la marche à suivre, et une page dédiée — et non une erreur — lorsqu'aucune donnée n'a encore été importée. - Journal d'audit :
logs/audit.logtrace les actions sensibles (connexions, actualisations de données, envois Slack, actions reeval) avec l'IP cliente — jamais les identifiants.
-
Construire et lancer le conteneur :
make up # équivaut à : docker compose up -d --build -
Accéder à l'application : Rendez-vous sur http://localhost:80
Commandes disponibles :
| Commande | Effet |
|---|---|
make up |
Construit l'image et démarre les conteneurs |
make logs |
Suit les journaux (tracebacks, actualisations, scheduler) |
make down |
Arrête les conteneurs |
make clean |
Purge images, volumes et cache Docker inutilisés |
1. Installation
# Créer un venv
python -m venv .venv
# Activer le venv
# Windows:
.venv\Scripts\activate
# Mac/Linux:
source .venv/bin/activate
# Installer les dépendances
pip install -r requirements.txt2. Configuration
Renommez .env.example en .env (si disponible) et configurez vos variables :
SLACK_TOKEN=xoxb-...
SLACK_CHANNEL=...
3. Lancement
python run.pyL'application sera accessible sur http://127.0.0.1:5000
Documentation complète disponible dans DEPLOYMENT.md.
En résumé :
- Clonez le repo sur l'instance.
- Créez votre fichier
.env. - Lancez avec
docker compose up -d --build.
slack_bot_flask/
├─ app/
│ ├─ __init__.py # create_app, logging, pages d'erreur, scheduler
│ ├─ routes.py # endpoints dont dashboard, leaderboard, etc.
│ ├─ extensions.py # rate limiter partagé
│ ├─ slack_handler.py # fonctions post_message et post_thread_message
│ ├─ static/
│ └─ templates/
├─ backend/
│ ├─ audit.py # journal des actions sensibles
│ ├─ crypto_utils.py # chiffrement des identifiants au repos
│ ├─ nexus_client.py # client API Nexus & téléchargement des exports
│ ├─ kpi_animators.py # fonctions de traitement en logique animateurs
│ ├─ kpi_comments.py # logique commentaires
│ ├─ kpi_masterclass.py # logique masterclass
│ ├─ kpi_techaway.py # logique techaway
│ ├─ preprocess.py # preprocess et light_preprocess
│ ├─ reporting.py # formattage des messages pour Slack
│ ├─ scheduler.py # job du récap hebdomadaire
│ ├─ job_state.py # verrous inter-workers & suivi du récap hebdo
│ ├─ utils.py # fonctions utilitaires
│ └─ mapping/
├─ data/
│ ├─ processed/
│ └─ uploads/
├─ reevaluation_time_exercise/ # module de reevaluation du temps des exercices
│ ├─ app/
│ │ ├─ static/
│ │ ├─ templates/
│ │ ├─ data_processor.py # logique de traitement des modules et cohortes
│ │ ├─ nexus_client.py # client API Nexus
│ │ └─ routes.py # endpoints reeval (login, dashboard, APIs)
├─ deploy/ # configurations nginx (HTTP et HTTPS)
├─ config.py # variables d'env (bot slack et app)
├─ Makefile # up / logs / down / clean
├─ Dockerfile
├─ docker-compose.yml
├─ DEPLOYMENT.md
└─ run.py
L'application lit les exports bruts déposés dans data/uploads/ sous des noms standardisés :
| Fichier | Sondage Nexus |
|---|---|
post_meeting_masterclass.csv |
Masterclass (FR) |
post_meeting_masterclass_en.csv |
Masterclass (EN) |
techaway_post_tp.csv |
TechAway post-TP (FR) |
techaway_post_tp_en.csv |
TechAway post-TP (EN) |
Le bouton Actualiser et la page /upload écrivent tous deux sous ces noms, puis
retraitent l'ensemble des sources vers data/processed/merged_processed.csv, le
fichier unique consommé par les vues. Importer un seul sondage ne supprime donc pas
les données de l'autre.