PrepaStrat · Aide

Le board de suivi des écoles

Ce que voit un administrateur d'école, d'où viennent les chiffres, ce qu'ils veulent dire exactement — et ce qui reste entre vos mains.

← Retour au configurateur
1 Le principe

Le board est un écran unique où l'administrateur d'une école partenaire voit où en est sa promotion : combien d'étudiants, qui avance, qui n'a jamais validé son adresse, quels contenus accrochent.

Il ne montre qu'une école : la sienne. Le nom de l'école n'est jamais lu dans l'adresse de la page, ni dans quoi que ce soit que le navigateur envoie : il est retrouvé dans la base au moment de la connexion, puis scellé dans la session. Autrement dit, un administrateur qui modifierait l'adresse à la main pour voir une autre école n'obtiendrait rien — c'est ce qui empêche une école de lire les chiffres d'une autre, et un test le vérifie : une session dont on change l'école est refusée.
2 Comment on entre

Pas de mot de passe. L'administrateur saisit son adresse, reçoit un code à six chiffres, et le saisit. C'est tout.

1

L'adresse doit figurer dans la liste

Une adresse qui n'y figure pas ne reçoit aucun code. Mais l'écran affiche exactement le même message dans les deux cas, que l'adresse ait accès ou non. Répondre « cette adresse n'a pas accès » reviendrait à confirmer, à qui essaierait des adresses au hasard, lesquelles sont celles des administrateurs.

2

Le code vaut 3 heures et ne sert qu'une fois

Cinq tentatives au maximum : à la cinquième erreur, le code est détruit et il faut en redemander un.

C'est ce plafond de cinq essais qui protège, pas la durée de vie du code. Un code à six chiffres, ce sont 900 000 combinaisons possibles ; en cinq essais, la probabilité de tomber sur la bonne est de 5 sur 900 000 — soit une sur 180 000. Allonger la durée n'y changerait rien : celui qui essaie n'a que cinq coups à jouer, que le code reste valable dix minutes ou trois heures.

3

La session dure 12 heures

Passé ce délai, il faut redemander un code. Ce n'est pas figé : si c'est trop court à l'usage, la durée se change en une ligne.

🔴 Aujourd'hui, aucun e-mail ne part encore. L'envoi demande une clé du service d'e-mail (Brevo), qui reste à fournir. En attendant, le code est bien créé et il fonctionne, mais il est déposé dans le journal de la base au lieu d'être envoyé — seule une personne ayant accès au compte Cloudflare peut l'y lire. L'écran l'annonce franchement plutôt que de faire attendre un e-mail qui n'arrivera pas.

🟢 Le jour où la clé est fournie, l'envoi reprend de lui-même : rien à retirer, rien à redéployer, aucune intervention à ne pas oublier.
🔴 Un mot de passe a été envisagé, puis écarté. Il n'aurait rien changé au fond : il faut de toute façon un e-mail pour le choisir la première fois, et un autre pour le réinitialiser quand il est oublié — l'adresse reste donc le point de passage obligé. En échange, il aurait fallu demander à des directeurs d'école de retenir un mot de passe de plus, et traiter les oublis.
🟢 « Se connecter avec Google » ou « Microsoft » reste possible en plus, comme bouton supplémentaire : tout ce qui suit la connexion ne dépend que d'une adresse prouvée. Le jour où on l'ajoutera, il faudra n'accepter qu'une adresse vérifiée par le fournisseur — sinon un compte créé avec admin@ecole.fr chez un fournisseur laxiste ouvrirait le board de cette école.
3 D'où viennent les chiffres

Le board ne calcule rien quand on l'ouvre : il lit un relevé déjà calculé. Et il affiche toujours de quand il date.

1

Une collecte chaque nuit à 3 h

Elle interroge LearnWorlds école par école et écrit un relevé.

2

Et un rafraîchissement quand quelqu'un regarde

Si le relevé a plus de 15 minutes, le board sert l'existant immédiatement et relance une collecte en arrière-plan. Des chiffres quasi frais pour qui consulte, zéro requête quand personne ne consulte.

3

Un verrou de 5 minutes

Cinq administrateurs qui ouvrent le board à la même minute ne lancent pas cinq collectes.

🔴 Pourquoi pas du temps réel. Le plafond de l'API LearnWorlds est de 30 requêtes toutes les 10 secondes, et il est partagé avec le site. Une grosse collecte en pleine journée ralentirait l'annuaire et les pages que vos étudiants utilisent au même moment. Mesuré : une promotion de 4 étudiants coûte ~10 requêtes et 10 secondes ; une promotion de 600 en coûterait ~1 200, soit une dizaine de minutes. C'est cela qui justifie la nuit, pas la lenteur du board.
4 Ce que les chiffres veulent dire

Trois règles, et elles sont écrites à un seul endroit dans le code pour qu'un graphique ne puisse pas contredire le chiffre du haut de page.

1

Un invité et un accès retiré sont listés, mais hors des chiffres

Compter un invité à 0 % ferait baisser la moyenne de l'école à chaque invitation envoyée — cela punirait exactement le geste qu'on veut encourager. Un accès retiré n'est plus de la promotion, mais sa progression est conservée : l'action est réversible.

2

0 % et « inconnu » ne sont pas la même chose

Un étudiant à 0 % est un fait sur la promotion : il pèse dans la moyenne. Un étudiant dont la progression n'a pas pu être lue est une lacune de mesure : il en sort, et l'encart annonce alors sur quelle part de la promotion la moyenne porte.

3

« Jamais connecté » n'est pas « actif ce mois »

Un étudiant qui n'a jamais ouvert son compte n'a aucune date de dernière connexion. L'absence de date se laisse facilement confondre avec une date récente, et il se retrouverait alors compté parmi les actifs du mois — le chiffre que l'école regarde en premier serait gonflé par ceux qui ne sont jamais venus. Ce cas est traité à part, et un test empêche l'erreur de revenir.

🔴 Sur quoi les pourcentages sont calculés — et cela change de sens. Si l'école a un programme attitré, tous ses étudiants sont mesurés sur la même base. Sinon — cas de l'ESSEC aujourd'hui, où l'appartenance est portée par une simple étiquette — chacun est mesuré sur les cours auxquels il est inscrit. La moyenne devient alors une moyenne de taux individuels calculés sur des bases différentes, et non un taux d'avancement global. Le board annonce donc en clair, sous le titre, sur quelle base il a compté : deux moyennes qui s'affichent pareil ne disent pas la même chose, et une école a le droit de savoir laquelle on lui montre.
5 Les pages et les programmes

Les cours sont regroupés comme sur le site : Cours, Études de cas, Fiches secteur, Fiches cabinet, S'entraîner, Compétences, Webinars. Un administrateur d'école ne connaît pas les programmes LearnWorlds ; il connaît les pages que ses étudiants ouvrent.

Ce regroupement se vérifie tout seul. Les totaux par page tombent exactement sur les cartes comptées page par page : Cours 6 + 4 = 10, Études de cas 12, Fiches secteur 11, Fiches cabinet 10, S'entraîner 3. Cinq recoupements indépendants.

Presque tout se met à jour tout seul. Les noms de cours, les cours ajoutés à un programme, les nouveaux cours, les étudiants qui arrivent ou partent : tout est relu à chaque collecte. Rien n'est figé dans le code.

Une seule chose se déclare à la main : quelle page affiche quel programme. Et ce n'est pas un oubli. Cette correspondance n'existe nulle part ailleurs que dans le Site Builder : chaque page compose ses cartes au moment où l'étudiant l'ouvre, si bien qu'aucune lecture automatique de LearnWorlds ne peut la retrouver. Il faut donc la déclarer une fois — et une seule, puisqu'elle ne change que si vous réorganisez le site.

Elle est rangée dans la base plutôt que dans le code, ce qui veut dire qu'elle se modifie sans nous et sans mise à jour du site :

Où taper ces lignes. Dans le tableau de bord Cloudflare du compte qui héberge le board, ouvrir la base de données prepa-lw (rubrique D1), puis son onglet Console : on y colle le texte et on l'exécute, sans rien installer.

C'est la même base pour toutes les lignes de cette page, y compris celles du chapitre « Ajouter une école ». L'effet est immédiat et il n'y a rien à redémarrer : la collecte suivante en tient compte.

Si vous préférez la ligne de commande, l'équivalent est npx wrangler d1 execute prepa-lw --remote --command "…".
-- ranger un nouveau programme sur une page
INSERT INTO pages (programme_id, page, ordre) VALUES ('mon-programme', 'Cours', 1);

-- le déplacer
UPDATE pages SET page = 'Compétences' WHERE programme_id = 'mon-programme';

-- voir l'état actuel
SELECT page, programme_id FROM pages ORDER BY ordre, page;
🔴 programme_id est le champ id de l'API d'administration, pas titleId : ce dernier est vide en lecture (mesuré sur 12 programmes sur 12). S'y tromper met tous les programmes « sans page ».

🔴 Deux identifiants dont le nom trompe : etudes-de-cas est « Tout Savoir sur les Études de Cas », qui vit sur Compétences et non sur la page Cas ; et introduction est « Business Sense ».
🟢 Un programme absent de cette table est signalé, jamais rangé au hasard. Vous n'avez donc rien à surveiller : le board vous dira quand il faut ajouter une ligne.
6 Les versions anglaises

Un cours et sa version anglaise forment une seule ligne, avec deux jeux de chiffres. Présenter deux lignes reviendrait à montrer deux fois le même contenu à une école, et un étudiant inscrit aux deux versions pèserait double.

L'appariement se déduit, sans table à maintenir, par deux règles :

1

Le nom du programme

X EN est la version anglaise de X. À l'intérieur, les cours s'apparient par leur numéro de niveau, présent dans les deux titres (Niveau #1Level #1).

2

Le suffixe du titre

Un cours nommé … EN rejoint celui du même nom sans le suffixe.

Mesuré : 5 appariements sur 6, automatiquement. Le sixième est signalé et reste une ligne visible — le faire disparaître ferait perdre du travail réel, puisque 14 progressions touchent les versions anglaises.
🔴 Pourquoi pas simplement le titre : les titres anglais ont été retraduits (« Level #1 - Introduction to Strategy Consulting »), ce qui est un bon choix produit — un étudiant anglophone ne veut pas lire un titre français — mais supprime toute règle à leur niveau. Une seule paire sur six suit encore la convention du suffixe.
7 Ajouter une école, un administrateur

Deux lignes suffisent : une pour l'école, une pour la personne qui pourra s'y connecter. Elles se tapent au même endroit que celles du chapitre précédent — la console de la base prepa-lw, dans le tableau de bord Cloudflare.

-- une école : `tag` est l'étiquette LearnWorlds qui définit sa promotion
INSERT INTO ecoles (tag, nom, domaine, programme, actif, cree)
VALUES ('ecole-escp', 'ESCP', 'escp.eu', NULL, 1, date('now'));

-- qui peut se connecter, et pour quelle école
INSERT INTO admins (email, ecole_tag, nom, actif, cree)
VALUES ('directeur@escp.eu', 'ecole-escp', 'Prénom Nom', 1, date('now'));

-- retirer un accès sans rien supprimer
UPDATE admins SET actif = 0 WHERE email = 'directeur@escp.eu';
Ce qu'il faut remplacer, et rien d'autre : l'étiquette (ecole-escp), le nom affiché, le domaine e-mail de l'école, puis l'adresse et le nom de la personne. date('now') inscrit la date du jour toute seule — inutile de la saisir. NULL à la place du programme signifie « cette école n'a pas de programme attitré » : c'est le cas de l'ESSEC aujourd'hui, et cela change la base de calcul des pourcentages (voir « Ce que les chiffres veulent dire »).
🔴 C'est l'étiquette qui fait foi, jamais le champ « école » du profil. Ce champ est saisi par l'étudiant : mesuré, un filtre sur sa valeur rendait 1 membre sur 7, parce que six avaient écrit la réponse autrement. Une étiquette, elle, ne se reformule pas.

🔴 actif = 0 plutôt qu'une suppression : on garde la trace de qui avait accès. Attention toutefois — une session déjà ouverte reste valable jusqu'à son expiration (12 h).
8 Ce qui peut casser
!

Des comptes de test dans une vraie promotion

Une automatisation associe le domaine boks.app à l'étiquette ESSEC. Résultat mesuré : 2 des 4 étudiants de la promotion ESSEC sont des comptes de test, et ils tirent sa moyenne vers le bas. À retirer avant qu'une vraie école ne regarde.

!

Des cours hors programme

Un cours qu'aucun programme ne contient n'apparaît sur aucune page du site : aucun étudiant ne peut le trouver. Le board les compte, ce qui permet de s'en apercevoir.

!

Une clé manquante

Sans la clé d'envoi d'e-mail, aucun code ne part — c'est la situation actuelle, décrite au chapitre « Comment on entre ». Sans la clé qui signe les sessions, aucune connexion n'est acceptée du tout : devant une configuration incomplète, le board se ferme au lieu de s'ouvrir par accident.

9 Qui fait quoi
Ce qu'il faut faireQui
Créer les cours et les programmes, poser les étiquettes d'école VousLearnWorlds
Corriger l'automatisation qui associe boks.app à l'ESSEC VousLearnWorlds
Ajouter une école, un administrateur, ranger un programme sur une page VousBase de données · 1 ligne de SQL
Lire les étudiants, leur progression, les noms de cours, l'appartenance aux programmes Le code À chaque collecte
Apparier les versions anglaises, calculer les chiffres, signaler ce qu'il ne sait pas ranger Le code À chaque collecte
Ce qui n'est pas encore fait, pour être complet : la courbe d'activité sur 12 semaines n'a aucune source — LearnWorlds ne rend que la dernière date de connexion de chaque étudiant, pas un historique. La reconstituer demanderait de conserver un relevé après relevé. Le graphique le dit à l'écran plutôt que d'afficher une courbe inventée.