112 lines
4.1 KiB
Markdown
112 lines
4.1 KiB
Markdown
# FAQ / Dépannage
|
|
|
|
## Synchronisation Escada
|
|
|
|
### "Import timeout — vérifiez les logs (> 15min)"
|
|
|
|
Le subprocess Selenium n'a pas répondu dans le temps imparti. Causes possibles :
|
|
- Escadaweb répond très lentement (en pic de charge)
|
|
- Captcha / re-login imposé par Escada
|
|
- Container Docker en surcharge
|
|
|
|
**Que faire** :
|
|
1. Aller dans `/logs` et chercher le dernier `[sync]` actif
|
|
2. Si Selenium est bloqué sur un écran de login : lancer un Actualiser des classes (re-login)
|
|
3. Si gros volume de classes : lancer la sync en plusieurs lots de 5-6 classes
|
|
|
|
### "Aucune classe récupérée"
|
|
|
|
Le scraping Selenium a échoué — souvent token de session expiré.
|
|
|
|
**Que faire** : recliquer sur "Actualiser" (ça force un re-login propre).
|
|
|
|
### "Le push échoue toujours sur le même apprenti"
|
|
|
|
Possibles causes :
|
|
- L'apprenti existe en local mais pas (ou plus) sur Escada → le pending est obsolète, à supprimer
|
|
- Le nom diffère entre local et Escada (ex: prénom composé partiel)
|
|
- La page Escada de cet apprenti est verrouillée par un autre éditeur (lock pessimiste Escada)
|
|
|
|
**Que faire** :
|
|
1. Vérifier les logs pour le message d'erreur exact
|
|
2. Si l'apprenti n'existe plus : supprimer le pending manuellement en DB
|
|
3. Sinon : retenter plus tard
|
|
|
|
### "L'option 'Forcer la réimportation complète' est en rouge — c'est dangereux ?"
|
|
|
|
Pas dangereux mais **destructif** :
|
|
- Tous les pendings concernés sont écrasés (les modifs locales pas encore poussées sont perdues)
|
|
- Tous les statuts d'absences sont remis à ce qu'Escada dit
|
|
|
|
À utiliser **uniquement** quand on veut sciemment reprendre l'état complet d'Escada.
|
|
|
|
## Tâches planifiées (cron)
|
|
|
|
### "J'ai créé une tâche, elle ne se déclenche pas"
|
|
|
|
Vérifier dans l'ordre :
|
|
|
|
1. La tâche est-elle **activée** ? (toggle vert)
|
|
2. L'horaire est-il dans le bon fuseau horaire ? (l'app fonctionne en `Europe/Zurich`)
|
|
3. La crontab du host appelle-t-elle bien `cron_tick.py` ?
|
|
|
|
```bash
|
|
crontab -l | grep cron_tick
|
|
# Doit avoir : * * * * * docker exec eptm-dashboard-app-1 python scripts/cron_tick.py
|
|
```
|
|
|
|
4. Regarder le log : `docker exec eptm-dashboard-app-1 cat /logs/cron/`
|
|
|
|
### "La tâche ne notifie pas sur Telegram"
|
|
|
|
- `notify_on` doit être `always`, `success` ou `failure` (pas `never`)
|
|
- Le `bot_token` et `chat_id` doivent être valides → tester via le bouton "Tester Telegram"
|
|
|
|
## Authentification
|
|
|
|
### "J'ai perdu mon téléphone avec mon code 2FA"
|
|
|
|
Un admin peut réinitialiser le 2FA via la page `/users` : "Réinitialiser 2FA". Au prochain login, l'utilisateur reverra le QR code.
|
|
|
|
### "Mon utilisateur est bloqué après plusieurs tentatives"
|
|
|
|
Pas de blocage automatique pour le moment. Si on veut en ajouter un : voir `state.py:handle_login`.
|
|
|
|
## Données
|
|
|
|
### "Les BN affichent des trous (cellules vides)"
|
|
|
|
C'est normal : un apprenti peut avoir commencé sa formation au S2 ou S3 → les premiers semestres restent vides. L'extraction depuis le PDF Escada respecte ces trous.
|
|
|
|
### "Les notes Matu n'apparaissent pas"
|
|
|
|
Pré-requis : l'apprenti est dans une classe MP/MI correspondante. Le matching se fait via la classe MP1, MP2, etc. La sync Matu cherche le PDF correspondant **si la case "BN" est cochée**.
|
|
|
|
## Performance
|
|
|
|
### "L'app rame quand je change de classe avec beaucoup d'apprentis"
|
|
|
|
Le `_reload` reconstruit les tableaux HTML BN/Notes pour chaque apprenti — peut prendre quelques secondes pour 25+ apprentis. Un skeleton s'affiche pendant le chargement pour donner du feedback visuel.
|
|
|
|
Si vraiment lent : envisager une mise en cache des HTML rendus dans la DB (à voir avec un dev).
|
|
|
|
## Conteneur Docker
|
|
|
|
### "Le conteneur consomme 100% CPU à l'idle"
|
|
|
|
Bug historique lié au hot-reload qui détectait les fichiers WAL/SHM de SQLite comme des modifications source. Corrigé via `REFLEX_HOT_RELOAD_EXCLUDE_PATHS=/app/data` dans le docker-compose.
|
|
|
|
Si ça revient : vérifier que cette variable est bien présente dans `docker-compose.dev.yml`.
|
|
|
|
### "Comment redémarrer proprement"
|
|
|
|
```bash
|
|
cd /opt/eptm-dashboard
|
|
docker compose -f docker-compose.dev.yml restart app
|
|
```
|
|
|
|
### "Comment voir les logs du serveur Reflex"
|
|
|
|
```bash
|
|
docker logs -f eptm-dashboard-app-1
|
|
```
|