Documente le réaudit et complète la navigation
This commit is contained in:
parent
8f276b5c47
commit
03e0c114f7
3 changed files with 292 additions and 0 deletions
|
|
@ -143,6 +143,7 @@
|
|||
<ul class="dropdown-menu dropdown-menu-end">
|
||||
<li><span class="dropdown-item-text small text-muted">{{ current_user.role_label }}</span></li>
|
||||
<li><hr class="dropdown-divider"></li>
|
||||
<li><a class="dropdown-item" href="{{ url_for('auth.profile') }}"><i class="bi bi-person-vcard"></i> Mon profil</a></li>
|
||||
<li><a class="dropdown-item" href="{{ url_for('auth.change_own_password') }}"><i class="bi bi-key"></i> Changer mon mot de passe</a></li>
|
||||
<li><hr class="dropdown-divider"></li>
|
||||
<li><a class="dropdown-item" href="{{ url_for('auth.logout') }}"><i class="bi bi-box-arrow-right"></i> Déconnexion</a></li>
|
||||
|
|
@ -211,6 +212,7 @@
|
|||
<li><a class="dropdown-item" href="{{ url_for('equipments.categories') }}"><i class="bi bi-tags"></i> Catégories</a></li>
|
||||
<li><hr class="dropdown-divider" style="border-color:rgba(255,255,255,0.15)"></li>
|
||||
<li><a class="dropdown-item" href="{{ url_for('buildings.index') }}"><i class="bi bi-buildings"></i> Bâtiments</a></li>
|
||||
<li><a class="dropdown-item" href="{{ url_for('zones.index') }}"><i class="bi bi-diagram-3"></i> Zones</a></li>
|
||||
<li><a class="dropdown-item" href="{{ url_for('rooms.index') }}"><i class="bi bi-door-open"></i> Salles</a></li>
|
||||
<li><a class="dropdown-item" href="{{ url_for('housing.index') }}"><i class="bi bi-house-door"></i> Logements de fonction</a></li>
|
||||
<li><a class="dropdown-item" href="{{ url_for('room_types.index') }}"><i class="bi bi-tags"></i> Types de salles</a></li>
|
||||
|
|
@ -220,6 +222,7 @@
|
|||
<li><a class="dropdown-item" href="{{ url_for('lots.index') }}"><i class="bi bi-boxes"></i> Lots</a></li>
|
||||
<li><a class="dropdown-item" href="{{ url_for('services.index') }}"><i class="bi bi-building-gear"></i> Services</a></li>
|
||||
<li><a class="dropdown-item" href="{{ url_for('parts.index') }}"><i class="bi bi-box-seam"></i> Pièces</a></li>
|
||||
<li><a class="dropdown-item" href="{{ url_for('meters.index') }}"><i class="bi bi-graph-up-arrow"></i> Historique des compteurs</a></li>
|
||||
<li><hr class="dropdown-divider" style="border-color:rgba(255,255,255,0.15)"></li>
|
||||
<li><a class="dropdown-item" href="{{ url_for('equipments.to_trash') }}"><i class="bi bi-trash"></i> À jeter</a></li>
|
||||
<li><a class="dropdown-item" href="{{ url_for('equipments.trashed') }}"><i class="bi bi-archive"></i> Anciens</a></li>
|
||||
|
|
@ -238,15 +241,23 @@
|
|||
<li><a class="dropdown-item" href="{{ url_for('constraints.index') }}"><i class="bi bi-shield-exclamation"></i> Contraintes de zone</a></li>
|
||||
<li><hr class="dropdown-divider" style="border-color:rgba(255,255,255,0.15)"></li>
|
||||
<li><a class="dropdown-item" href="{{ url_for('outlook_pages.index') }}"><i class="bi bi-envelope-at"></i> Comptes Outlook</a></li>
|
||||
<li><a class="dropdown-item" href="{{ url_for('outlook_pages.add_account') }}"><i class="bi bi-person-plus"></i> Ajouter un compte Outlook</a></li>
|
||||
<li><a class="dropdown-item" href="{{ url_for('outlook_dashboard.processed_folders_config') }}"><i class="bi bi-folder-check"></i> Dossiers Outlook surveillés</a></li>
|
||||
<li><a class="dropdown-item" href="{{ url_for('ent.index') }}"><i class="bi bi-broadcast"></i> ENT77</a></li>
|
||||
<li><a class="dropdown-item" href="{{ url_for('ent.messages') }}"><i class="bi bi-inbox"></i> Messages ENT</a></li>
|
||||
<li><a class="dropdown-item" href="{{ url_for('ent.interpretations') }}"><i class="bi bi-stars"></i> Interprétations ENT</a></li>
|
||||
<li><a class="dropdown-item" href="{{ url_for('ent.staff') }}"><i class="bi bi-people"></i> Personnels ENT</a></li>
|
||||
<li><hr class="dropdown-divider" style="border-color:rgba(255,255,255,0.15)"></li>
|
||||
<li><a class="dropdown-item" href="{{ url_for('pronote.connect') }}"><i class="bi bi-qr-code"></i> PRONOTE (QR)</a></li>
|
||||
<li><form method="post" action="{{ url_for('pronote.sync_salles') }}"><button class="dropdown-item" type="submit"><i class="bi bi-download"></i> PRONOTE (sync salles)</button></form></li>
|
||||
<li><a class="dropdown-item" href="{{ url_for('pronote.planning') }}"><i class="bi bi-calendar3"></i> PRONOTE (plannings)</a></li>
|
||||
<li><a class="dropdown-item" href="{{ url_for('pronote.rooms') }}"><i class="bi bi-door-open"></i> Salles PRONOTE</a></li>
|
||||
<li><a class="dropdown-item" href="{{ url_for('pronote.personnels') }}"><i class="bi bi-person-badge"></i> Personnels PRONOTE</a></li>
|
||||
<li><a class="dropdown-item" href="{{ url_for('pronote.professeurs') }}"><i class="bi bi-person-workspace"></i> Professeurs PRONOTE</a></li>
|
||||
<li><hr class="dropdown-divider" style="border-color:rgba(255,255,255,0.15)"></li>
|
||||
<li><a class="dropdown-item" href="{{ url_for('yeastar.index') }}"><i class="bi bi-telephone"></i> Téléphone P520</a></li>
|
||||
<li><a class="dropdown-item" href="{{ url_for('yeastar.config_page') }}"><i class="bi bi-telephone-gear"></i> Config téléphone</a></li>
|
||||
<li><a class="dropdown-item" href="{{ url_for('yeastar.dnd_config_page') }}"><i class="bi bi-bell-slash"></i> Watchdog DND</a></li>
|
||||
<li><hr class="dropdown-divider" style="border-color:rgba(255,255,255,0.15)"></li>
|
||||
<li><a class="dropdown-item" href="{{ url_for('status.index') }}"><i class="bi bi-activity"></i> Status système</a></li>
|
||||
<li><a class="dropdown-item" href="{{ url_for('logs.index') }}"><i class="bi bi-journal-text"></i> Logs watchdogs</a></li>
|
||||
|
|
@ -261,9 +272,17 @@
|
|||
<!-- Mobile : liens config à plat -->
|
||||
<li class="nav-item d-lg-none"><a class="nav-link" href="{{ url_for('gmao_config.index') }}"><i class="bi bi-gear"></i> Contexte GMAO</a></li>
|
||||
<li class="nav-item d-lg-none"><a class="nav-link" href="{{ url_for('outlook_pages.index') }}"><i class="bi bi-envelope-at"></i> Outlook</a></li>
|
||||
<li class="nav-item d-lg-none"><a class="nav-link" href="{{ url_for('outlook_dashboard.processed_folders_config') }}"><i class="bi bi-folder-check"></i> Dossiers Outlook</a></li>
|
||||
<li class="nav-item d-lg-none"><a class="nav-link" href="{{ url_for('ent.index') }}"><i class="bi bi-broadcast"></i> ENT77</a></li>
|
||||
<li class="nav-item d-lg-none"><a class="nav-link" href="{{ url_for('ent.messages') }}"><i class="bi bi-inbox"></i> Messages ENT</a></li>
|
||||
<li class="nav-item d-lg-none"><a class="nav-link" href="{{ url_for('ent.interpretations') }}"><i class="bi bi-stars"></i> Interprétations ENT</a></li>
|
||||
<li class="nav-item d-lg-none"><a class="nav-link" href="{{ url_for('pronote.connect') }}"><i class="bi bi-qr-code"></i> PRONOTE</a></li>
|
||||
<li class="nav-item d-lg-none"><a class="nav-link" href="{{ url_for('pronote.rooms') }}"><i class="bi bi-door-open"></i> Salles PRONOTE</a></li>
|
||||
<li class="nav-item d-lg-none"><a class="nav-link" href="{{ url_for('pronote.personnels') }}"><i class="bi bi-person-badge"></i> Personnels PRONOTE</a></li>
|
||||
<li class="nav-item d-lg-none"><a class="nav-link" href="{{ url_for('pronote.professeurs') }}"><i class="bi bi-person-workspace"></i> Professeurs PRONOTE</a></li>
|
||||
<li class="nav-item d-lg-none"><a class="nav-link" href="{{ url_for('yeastar.index') }}"><i class="bi bi-telephone"></i> Téléphone</a></li>
|
||||
<li class="nav-item d-lg-none"><a class="nav-link" href="{{ url_for('yeastar.config_page') }}"><i class="bi bi-telephone-gear"></i> Config téléphone</a></li>
|
||||
<li class="nav-item d-lg-none"><a class="nav-link" href="{{ url_for('yeastar.dnd_config_page') }}"><i class="bi bi-bell-slash"></i> Watchdog DND</a></li>
|
||||
<li class="nav-item d-lg-none"><a class="nav-link" href="{{ url_for('status.index') }}"><i class="bi bi-activity"></i> Status</a></li>
|
||||
<li class="nav-item d-lg-none"><a class="nav-link" href="{{ url_for('logs.index') }}"><i class="bi bi-journal-text"></i> Logs</a></li>
|
||||
<li class="nav-item d-lg-none"><a class="nav-link" href="{{ url_for('auth.list_users') }}"><i class="bi bi-people"></i> Utilisateurs</a></li>
|
||||
|
|
|
|||
269
docs/AUDIT_2026-08-14.md
Normal file
269
docs/AUDIT_2026-08-14.md
Normal file
|
|
@ -0,0 +1,269 @@
|
|||
# Réaudit fonctionnel, technique et UI
|
||||
|
||||
Date : 14 août 2026
|
||||
|
||||
État audité : branche `main`, commit `8f276b5`
|
||||
|
||||
Périmètre : routes Flask, templates actifs, permissions, données MariaDB,
|
||||
planification, intégrations, Docker, sauvegardes et tests.
|
||||
|
||||
## Verdict
|
||||
|
||||
Le projet est utilisable comme environnement de développement et de
|
||||
démonstration. Il n'est pas encore prêt pour une utilisation réelle au collège.
|
||||
Les principaux blocages sont la planification préventive incohérente, plusieurs
|
||||
pages en erreur, les vocabulaires de statuts divergents, le compte de test
|
||||
`admin/admin`, l'autorisation des documents et une stratégie de restauration
|
||||
incomplète.
|
||||
|
||||
Le dépôt était propre et synchronisé au début de l'audit. L'audit n'a modifié ni
|
||||
la base ni les données de production.
|
||||
|
||||
## Mesures et contrôles
|
||||
|
||||
- 319 règles d'URL et 317 endpoints enregistrés ;
|
||||
- 121 routes GET fixes testées avec un compte administrateur ;
|
||||
- 67 tests automatisés réussis ;
|
||||
- 163 appels à `render_template`, pour 138 templates distincts ;
|
||||
- 15 liens `url_for()` invalides dans les templates actifs ;
|
||||
- 32 noms de templates dupliqués entre le dossier global et les blueprints ;
|
||||
- 5 pages fixes reproduisent une erreur ;
|
||||
- 376 équipements et 470 tâches planifiées dans la base auditée ;
|
||||
- environ 1,15 Mo de HTML pour la liste des 376 équipements.
|
||||
|
||||
## Blocages P0
|
||||
|
||||
### Authentification
|
||||
|
||||
Le compte de test `admin/admin` est actif. Avant ouverture à d'autres
|
||||
utilisateurs, il faut supprimer ce mot de passe, imposer un changement au
|
||||
premier accès, refuser les mots de passe faibles et journaliser les échecs de
|
||||
connexion.
|
||||
|
||||
### Planification préventive
|
||||
|
||||
La base contient 330 tâches de lot et 470 échéances, dont 300 placées un
|
||||
week-end. Les 330 tâches importées sont actuellement classées comme
|
||||
calendaires. Les règles gel, orage, saison, compteur et événement ne sont donc
|
||||
pas correctement représentées.
|
||||
|
||||
Deux chemins de génération coexistent. Le chemin historique ignore une partie
|
||||
du calendrier de travail. Le moteur récent traite mieux les déclencheurs mais
|
||||
ne recalcule pas toujours la prochaine date à partir de la dernière réalisation.
|
||||
|
||||
Un seul moteur doit :
|
||||
|
||||
- partir de la dernière exécution ;
|
||||
- respecter périodicité, anticipation et jours travaillés ;
|
||||
- fermer les vacances scolaires par défaut ;
|
||||
- accepter les jours exceptionnels avec horaires propres à chaque date ;
|
||||
- distinguer calendrier, saison, météo, événement et compteur ;
|
||||
- prévisualiser et réconcilier les échéances avant écriture ;
|
||||
- empêcher les doublons par une contrainte en base.
|
||||
|
||||
### Pages en erreur et navigation
|
||||
|
||||
Les routes fixes suivantes ont échoué pendant le test :
|
||||
|
||||
- `/admin/room-types/new` : template absent ;
|
||||
- `/planning/availability/leave/new` : endpoint de retour inexistant ;
|
||||
- `/room-types/new` : formulaire non transmis au template ;
|
||||
- `/yeastar/api/extensions` : erreur 500 lorsque Yeastar est absent ;
|
||||
- `/yeastar/config` : accès incorrect à une configuration vide.
|
||||
|
||||
La création d'une tâche préventive référence aussi `LotTask` sans import local,
|
||||
et les routes de formation construisent des attributs absents de leurs modèles.
|
||||
|
||||
### Statuts et tableau de bord
|
||||
|
||||
Les équipements présents utilisent notamment `en_service`, `en_panne`,
|
||||
`en_maintenance`, `hs`, `a_jeter` et `jete`, tandis que certains indicateurs
|
||||
recherchent encore `actif` ou `panne`. Les totaux du tableau de bord peuvent
|
||||
donc être faux. L'urgence mélange par endroits le statut et la priorité, et le
|
||||
stock faible est encore fixé à zéro.
|
||||
|
||||
Une énumération unique, une migration des valeurs et des tests de statistiques
|
||||
sont nécessaires.
|
||||
|
||||
### Intégrité des interventions
|
||||
|
||||
Une intervention générale sans équipement peut être associée silencieusement
|
||||
au premier équipement de la base. Une intervention doit pouvoir cibler un
|
||||
équipement, une salle, une zone, un bâtiment, un logement ou aucun objet
|
||||
patrimonial, sans attribution artificielle.
|
||||
|
||||
Le message Outlook ou ENT à l'origine d'une intervention doit être conservé en
|
||||
lecture seule au lieu d'être supprimé après conversion.
|
||||
|
||||
### API, documents et historique
|
||||
|
||||
L'authentification API lit un attribut `api_key` absent du modèle clé/valeur.
|
||||
Les futures clés doivent être hachées, révocables, expirables, limitées par
|
||||
permission et auditées.
|
||||
|
||||
Le blueprint `documents` n'est pas classé explicitement dans les permissions :
|
||||
la lecture peut hériter d'un droit trop large tandis que les mutations exigent
|
||||
un droit système. Les droits doivent venir de l'objet parent. Il faut également
|
||||
contrôler MIME, contenu, taille, checksum et suppression logique.
|
||||
|
||||
Les changements de statut et autres historiques ne sont pas réellement
|
||||
immuables s'ils sont supprimés en cascade avec l'intervention.
|
||||
|
||||
### Sauvegarde et exploitation
|
||||
|
||||
La sauvegarde actuelle ne constitue pas encore un plan de reprise : les uploads
|
||||
et la configuration ne sont pas couverts de bout en bout, il n'y a pas de copie
|
||||
chiffrée hors machine et aucune restauration régulière n'est vérifiée.
|
||||
|
||||
Avant production : reverse proxy HTTPS, cookies sécurisés, sauvegarde complète,
|
||||
copie hors machine, restauration automatisée de contrôle et supervision des
|
||||
échecs.
|
||||
|
||||
## État fonctionnel des données
|
||||
|
||||
| Objet | Nombre |
|
||||
|---|---:|
|
||||
| Bâtiments | 7 |
|
||||
| Zones | 22 |
|
||||
| Salles | 228 |
|
||||
| Logements | 0 |
|
||||
| Catégories | 36 |
|
||||
| Lots | 91 |
|
||||
| Équipements | 376 |
|
||||
| Interventions | 0 |
|
||||
| Tâches de lot | 330 |
|
||||
| Tâches planifiées | 470 |
|
||||
|
||||
Points de qualité : 29 salles n'ont pas de zone, 87 lots déclarés présents
|
||||
n'ont pas d'équipement directement associé et aucun lot n'est marqué absent.
|
||||
Le diagnostic des lots devra compter séparément les équipements directs et les
|
||||
équipements héritant du lot de leur groupe.
|
||||
|
||||
## Navigation et pages orphelines
|
||||
|
||||
Le contrôle automatique a trouvé 34 routes GET sans lien entrant. Elles ne sont
|
||||
pas toutes destinées à la navigation : 19 sont des API, exports, redirections
|
||||
ou formulaires enfants qui doivent être ouverts depuis leur liste parente.
|
||||
|
||||
Les accès directs utiles ajoutés au menu sont :
|
||||
|
||||
- profil utilisateur ;
|
||||
- zones et historique des compteurs ;
|
||||
- ajout de compte et dossiers surveillés Outlook ;
|
||||
- messages et interprétations ENT ;
|
||||
- salles, personnels et professeurs PRONOTE ;
|
||||
- configuration des identifiants et du watchdog DND Yeastar.
|
||||
|
||||
Les routes historiques `/admin/room-types`, `/admin/services` et
|
||||
`/admin/staff` dupliquent des écrans métier existants. Elles ne doivent pas être
|
||||
ajoutées comme seconds écrans dans le menu : elles doivent être redirigées vers
|
||||
les pages canoniques puis supprimées. Les API et téléchargements ne sont pas des
|
||||
pages de menu.
|
||||
|
||||
Une vérification automatique de navigation doit être ajoutée à la CI : toute
|
||||
nouvelle page HTML GET sans paramètre doit soit recevoir un lien, soit être
|
||||
explicitement déclarée comme page enfant, redirection ou écran interne.
|
||||
|
||||
## Proposition UI
|
||||
|
||||
### Architecture de navigation
|
||||
|
||||
Conserver cinq espaces principaux : Accueil, Patrimoine, Interventions,
|
||||
Planning et Prévention. Les intégrations et l'administration restent réservées
|
||||
aux utilisateurs autorisés. À terme, la longue liste actuelle d'intégrations
|
||||
devrait devenir une page d'accueil « Intégrations » composée de cartes avec
|
||||
état, configuration, dernière synchronisation et journaux.
|
||||
|
||||
### Tableau de bord
|
||||
|
||||
Afficher des cartes dépendant du rôle : tâches du jour, retards, urgences,
|
||||
attente de pièce ou prestataire, contrats proches de l'échéance, stocks faibles,
|
||||
lots incohérents et temps de prévention. Chaque carte doit ouvrir une liste déjà
|
||||
filtrée.
|
||||
|
||||
### Inventaire
|
||||
|
||||
Ne plus rendre l'arbre complet. Charger progressivement : catégorie, bâtiment
|
||||
ou logement, zone, salle, groupe puis unité. Ajouter recherche instantanée,
|
||||
filtres mémorisés, sélection multiple et compteurs par niveau.
|
||||
|
||||
### Création d'équipements
|
||||
|
||||
Proposer trois parcours : fiche rapide, groupe quantitatif et assistant
|
||||
multi-salles. Les valeurs venant du lot doivent être visibles comme héritées.
|
||||
La création en masse doit offrir aperçu, validation des anomalies, rapport et
|
||||
annulation.
|
||||
|
||||
### Interventions
|
||||
|
||||
Ajouter liste, Kanban et calendrier. La fiche doit utiliser une chronologie
|
||||
unique pour statut, diagnostic, commentaires, photos, temps, pièces et visite
|
||||
prestataire. La détection de récurrence doit être paramétrable selon la
|
||||
catégorie : prise, fenêtre ou luminaire ne se traitent pas comme chaise ou
|
||||
graffiti.
|
||||
|
||||
### Logements
|
||||
|
||||
Ajouter historique des occupants, états des lieux, clés, compteurs, documents,
|
||||
inventaire et interventions. Les données personnelles de l'occupant exigent
|
||||
une permission séparée de la simple consultation du patrimoine.
|
||||
|
||||
### Prévention
|
||||
|
||||
Séparer tableau de bord, agents, risques, actions, habilitations, formations,
|
||||
incidents, DUERP et temps consacré. La cible de 10 % doit être calculée depuis
|
||||
le temps réellement travaillé et tenir compte de chaque journée exceptionnelle
|
||||
pendant les petites et grandes vacances.
|
||||
|
||||
### Composants et accessibilité
|
||||
|
||||
Réduire les pages de plusieurs centaines de lignes et les nombreux styles ou
|
||||
scripts intégrés. Construire des composants communs pour champs, badges,
|
||||
tableaux, filtres, états vides et erreurs. Corriger les blocs JavaScript nommés
|
||||
`scripts` alors que le layout rend `extra_scripts`, ajouter des libellés aux
|
||||
boutons icône et fournir les ressources critiques localement plutôt que par CDN
|
||||
seulement.
|
||||
|
||||
## Feuille de route
|
||||
|
||||
### Lot 1 — Stabilisation
|
||||
|
||||
- supprimer le mot de passe de test ;
|
||||
- corriger les cinq routes en erreur et les 15 liens invalides ;
|
||||
- réparer création de tâche et formations ;
|
||||
- unifier les statuts et les statistiques ;
|
||||
- empêcher l'attribution artificielle des interventions ;
|
||||
- tester chaque page fixe en CI.
|
||||
|
||||
### Lot 2 — Fiabilité métier
|
||||
|
||||
- fusionner les moteurs de maintenance ;
|
||||
- réconcilier les 470 tâches ;
|
||||
- intégrer complètement calendrier scolaire et horaires exceptionnels ;
|
||||
- corriger permissions documents et clés API ;
|
||||
- rendre les historiques non destructibles ;
|
||||
- tester une restauration complète.
|
||||
|
||||
### Lot 3 — Parcours quotidiens
|
||||
|
||||
- refondre navigation et tableau de bord ;
|
||||
- charger l'inventaire progressivement ;
|
||||
- finaliser la création en masse ;
|
||||
- compléter les logements ;
|
||||
- ajouter le workflow et la récurrence des interventions.
|
||||
|
||||
### Lot 4 — Fonctions avancées
|
||||
|
||||
- générer les visites contractuelles ;
|
||||
- tracer tous les mouvements de stock ;
|
||||
- fiabiliser compteurs et consommables ;
|
||||
- compléter prévention et DUERP ;
|
||||
- fournir exports métier et suivi des coûts.
|
||||
|
||||
### Lot 5 — Mise en production
|
||||
|
||||
- HTTPS et configuration de production ;
|
||||
- dépendances verrouillées et analyse de vulnérabilités ;
|
||||
- sauvegardes chiffrées hors machine ;
|
||||
- test de restauration ;
|
||||
- supervision, accessibilité, tests mobiles et test de charge.
|
||||
|
|
@ -1,5 +1,9 @@
|
|||
# Audit fonctionnel, pages, routes et permissions
|
||||
|
||||
> Ce document conserve l'audit historique réalisé avant les phases de
|
||||
> sécurisation. Le réaudit de l'état courant et la feuille de route active sont
|
||||
> disponibles dans [AUDIT_2026-08-14.md](AUDIT_2026-08-14.md).
|
||||
|
||||
Date de l'audit : 14 août 2026
|
||||
Périmètre : application Flask `app_new`, modèles, templates, routes enregistrées, configuration Docker et tests.
|
||||
|
||||
|
|
|
|||
Loading…
Reference in a new issue