Paramétrage du cahier de textes par classe/groupe — module cahier-de-textes (fr.openent.diary)
Implémentation technique de l'écran de paramétrage du cahier de textes par classe ou groupe (activer/désactiver), exigence CCTP MOD11 — Cahier de textes : « permettre la gestion et le paramétrage du cahier de textes de la classe ou du groupe ». Avant ce développement, aucun objet « cahier de classe » dédié n'existait : la couverture reposait implicitement sur le paramétrage des services vie-scolaire (enseignant + matière + classe), sans possibilité d'activer/désactiver le cahier de textes à l'échelle d'une classe ou d'un groupe.
Ce que voit l'utilisateur (scénario personnel de direction / gestion vie scolaire) : Cahier de textes → Paramétrer le cahier de textes par classe/groupe (doc fonctionnelle du module cahier de textes).
Vue d'ensemble
Le paramétrage est exposé dans l'écran Vie Scolaire → Paramétrages → Cahier de texte, à côté des
3 onglets existants (Initialisation, Types de travail, Types de séance) — un 4e onglet
« Cahier de textes par classe/groupe » y a été ajouté. Le module vie-scolaire héberge l'IHM
(cohérence avec les 3 autres onglets déjà présents dans cet écran), mais les données et l'API
appartiennent au module cahier-de-textes (fr.openent.diary), propriétaire fonctionnel du cahier
de textes.
Backend
Table diary.audience_settings
Migration sql/035-diary-audience-settings.sql :
CREATE TABLE diary.audience_settings (
structure_id varchar(36) NOT NULL,
audience_id varchar(36) NOT NULL,
enabled boolean NOT NULL DEFAULT TRUE,
PRIMARY KEY (structure_id, audience_id)
);
Une classe/groupe sans ligne dans cette table est considérée enabled = true par défaut (état
initial : tout est activé). Seuls les overrides (le plus souvent des désactivations) sont
persistés.
API
AudienceSettingsController (controllers/AudienceSettingsController.java), protégée par le même
droit que l'écran d'initialisation existant du module (@ResourceFilter(ViescoSettingInitialisationData.class),
workflow viesco.setting.initalisation.data) :
| Route | Rôle |
|---|---|
GET /diary/structures/:id/audience-settings | Liste les classes/groupes de l'établissement avec leur état enabled et les enseignants qui y interviennent |
PUT /diary/structures/:id/audience-settings/:audienceId | Active/désactive le cahier de textes pour une classe/groupe |
DefaultAudienceSettingsService — agrégation classes + services + overrides
getAudienceSettings combine trois sources hétérogènes :
- les classes de l'établissement (bus
viescolaire, actionclasse.getClasseEtablissement) ; - les services enseignant/matière/classe (bus
viescolaire, actionservice.getAllServices), pour en déduire les enseignants intervenant sur chaque classe/groupe ; - les overrides locaux (
diary.audience_settings, SQL direct) et les noms d'enseignants (Neo4j direct).
⚠️ Piège Vert.x rencontré : deux appels eb.request("viescolaire", …) lancés en parallèle
(CompositeFuture.all) vers ce bus ne renvoient jamais leur réponse (aucun des deux callbacks ne se
déclenche), alors que les mêmes appels fonctionnent correctement enchaînés en séquence. Cause
racine non identifiée avec certitude (candidat : contention sur un lock Hazelcast observé au même
moment dans les logs, lien de causalité non confirmé). Contournement appliqué : tous les appels
vers le bus "viescolaire" sont chaînés via Future.compose() ; seuls les appels SQL et Neo4j
directs (hors de ce bus) restent parallélisés entre eux via CompositeFuture.all.