Initial commit for finalisation web interface

This commit is contained in:
sebastien committed 2026-11-01 08:41:37 +01:00
1 parent b295f871a7
commit c36642e8de
33 files changed
+2745 -138

No files matched your search

+117
View File
@@ -0,0 +1,117 @@
# Finalisation dans le navigateur
La finalisation web est une **alternative facultative** aux quatre panneaux de
finalisation. Les panneaux existants et les commandes restent disponibles.
Elle fonctionne sur cet ordinateur, sans hébergement ni nouvel appel à Gemini.
## Ouvrir
Après **Lire les annotations manuscrites**, cliquez sur **Finalisation web…**
en haut du GUI, choisissez **Bnot** ou **BGnot**, puis **Ouvrir**. Le GUI reste
verrouillé par une fenêtre modale tant que le serveur fonctionne. Le bouton
**Arrêter le serveur et reprendre** ferme la session et recharge les éditeurs.
Fermer seulement l’onglet du navigateur ne ferme pas le serveur.
La commande équivalente est :
```sh
python -m copienator finalise-web CHEMIN_EVALUATION --annotation-dir BGnot
```
`--no-browser` affiche le lien sans ouvrir automatiquement le navigateur.
Les commandes utilisant le gestionnaire CLI commun respectent le verrou de
l’évaluation. Une régénération en cours doit finir avant l’arrêt normal du serveur.
Le verrou système est libéré à l’arrêt du processus ; le fichier de verrou
restant sur disque n’empêche pas la prochaine ouverture.
## Vérifier et modifier
- **Copie** seule : toutes les réponses de cette copie.
- **Label** seul : toutes les copies pour ce label.
- Les deux : leur intersection. Sans filtre, la page présente toutes les réponses
par lots de vingt, avec chargement différé des images.
- Cliquez sur une réponse pour l’agrandir. Les liens donnent accès au contexte,
à l’énoncé, au corrigé et au PDF final lorsqu’ils existent.
- Modifiez scores et remarques personnelles sous les images. Les remarques
acceptent le LaTeX utilisé dans le workflow existant.
- **Identités et remarques générales** permet de corriger les noms, d’ouvrir
l’originale et d’ajouter, supprimer ou réordonner les remarques de chaque copie.
- **Couper / transférer** montre exclusivement les corps de réponse. Cliquez sur
la source pour placer la coupe, ou réglez son pourcentage. Choisissez la cible,
la partie conservée et le placement, puis vérifiez **Aperçu du résultat**.
Les saisies locales sont conservées lors d’un changement de filtre. Enregistrez
les modifications avant de régénérer. Si une autre page a changé les fichiers,
une sauvegarde périmée est refusée ; **Recharger les données** actualise les
valeurs enregistrées en conservant les saisies locales à réexaminer.
## Brouillon, application et régénération
**Ajouter au brouillon** ne modifie pas les images. **Enregistrer le brouillon**
écrit le même `annotation_modifications.txt` que le GUI. Le fichier
`Bnot/annotation_modifications_applied.txt` ou son équivalent BGnot reste le
relevé des instructions effectivement appliquées.
**Régénérer les sorties** conserve par défaut ces instructions appliquées. Cochez
**Appliquer aussi le brouillon de transferts** pour remplacer les instructions
appliquées par le brouillon enregistré. Retirer une ligne du brouillon puis
l’appliquer annule le transfert correspondant. Les contraintes existantes restent
valables : une instruction par source, une cible ne peut pas être source, aucun
déplacement automatique des scores ou des en-têtes.
La régénération actualise les réponses, les documents combinés et **A Rendre**
selon les options de sortie existantes, en conservant les noms personnalisés.
Le journal indique les erreurs et les résultats incomplets. La chaîne s’arrête
à la première étape non réussie ; les modifications enregistrées restent
récupérables pour une nouvelle tentative. Les publications gardent les garanties
transactionnelles des moteurs existants (par copie pour la lecture, ensemble des
copies concernées pour les transferts), pas une transaction globale de toute
l’évaluation.
## Compatibilité et état de lecture
Les scores restent dans le dossier d’annotations choisi ; les remarques utilisent
`custom_remarks.json` et `general_remarks.json`. Les éditeurs existants utilisent
la même source de scores, y compris lorsque **A Rendre** contient des copies de
fichiers plutôt que des liens. La préparation des retours mémorise cette source
et retrouve les dossiers renommés par leur identifiant de copie.
Les lecteurs enregistrent maintenant `review_snapshot.json` et des images
`.review-note-*.png` : les données de correction après interprétation des cases,
la géométrie et les couches manuscrites, avant ajout des remarques personnelles.
Le navigateur utilise ces données pour reconstruire les en-têtes sans relire les
PDF manuscrits ni accumuler les remarques. Les reprises sélectives fusionnent
leurs seules questions avec l’état précédemment lu. Les baselines sans perte
restent la référence des coupes et transferts.
Pour une ancienne évaluation sans cet état, une régénération web ordinaire peut
le créer avec le lecteur existant et les scores conservés. En présence de BRnot,
la régénération refuse cette conversion automatique : il faut disposer d’une
lecture du passage principal puis de la reprise avec cette version pour conserver
l’interprétation complète. L’affichage et les éditeurs restent accessibles.
Si vous importez de nouvelles annotations ou refaites la correction/découpe,
repassez par **Lire les annotations manuscrites** dans le workflow existant avant
de revenir au navigateur. `regenerate-reviewed` réutilise l’interprétation
sauvegardée ; il ne recherche pas de nouvelles annotations.
Anot reste géré par le workflow existant. La finalisation web concerne Bnot et
BGnot, les deux modes qui disposent de corps de réponses éditables.
## Développement
L’API FastAPI/Uvicorn est dans `copienator/finalisation_server.py`, les opérations
dans `copienator/finalisation.py`. Le client React/TypeScript est dans `web/`.
Le paquet Python inclut les fichiers construits dans `copienator/web_static/` :
Node n’est pas nécessaire pour utiliser l’application installée.
```sh
cd web
npm ci
npm run build
```
Le serveur écoute uniquement sur `127.0.0.1`, sur un port libre, et exige un jeton
de session échangé contre un cookie HttpOnly. Les requêtes d’une autre origine
sont refusées. Les chemins des documents sont déterminés à partir des identifiants
validés, jamais fournis librement par le navigateur.
+9
View File
@@ -635,3 +635,12 @@ Vérifiez le **Passage principal**, puis exécutez. Contrôlez une question refa
**Effet :** supprime définitivement les fichiers de travail et la progression de l’interface en conservant les livrables prévus.
Attendez la fin des relectures et reprises. Vérifiez les résultats de tous les élèves dans `A Rendre` et sauvegardez l’évaluation si vous voulez pouvoir reprendre le travail. Choisissez d’abord **Prévisualiser sans supprimer**, puis examinez la liste. Ne lancez **Nettoyage définitif** qu’une fois certain de ne plus avoir besoin des intermédiaires : les PDF traités, textes de l’énoncé, corrections, journaux et livrables de `A Rendre` sont conservés, mais une reprise exigera de régénérer les données supprimées.
## Alternative : finalisation dans le navigateur
Le bouton **Finalisation web…** ouvre une interface locale facultative après la
lecture des annotations Bnot ou BGnot. Elle réunit les réponses filtrées par copie
et/ou label, les scores, remarques, noms et coupes/transferts. Le GUI est verrouillé
pendant la session ; les fichiers restent compatibles avec les panneaux existants.
Voir [le guide de finalisation web](finalisation_web.md) pour l’enregistrement,
l’application des brouillons, la régénération et les anciennes évaluations.