Files
Copies/docs/finalisation_web.md
T

149 lines
8.3 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# 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 génération des annotations **Anot**, ou après **Lire les annotations
manuscrites** pour **Bnot/BGnot**, cliquez sur **Finalisation web…** en haut du GUI,
choisissez le dossier disponible, 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. Le champ **Nom** propose
une complétion ; vous pouvez chercher une partie du nom, sans tenir compte des
accents ou des majuscules. Choisir un nom renseigne l’identifiant de copie, et
inversement. Les suggestions indiquent l’identifiant pour distinguer les doublons.
- **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.
## Score final exporté
Après **Ajouter le score final**, sélectionner une copie par identifiant ou nom
fait apparaître son **Score final exporté** au-dessus des réponses. Cette note
est celle du dernier export, arrondie comme sur le JPEG ; modifier les scores par
question ne la recalcule pas. Le passage enregistre désormais les notes dans
`.copienator/final_scores.json`, par identifiant, afin de conserver leur association
après un changement de nom.
Pour les anciens exports, la note peut être récupérée du fichier ODS uniquement
si ce fichier n’est pas plus récent que les documents exportés. Sinon, relancez
**Ajouter le score final** pour enregistrer la note de façon explicite.
## 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 case **Ignorer les copies inchangées**, cochée par défaut près du bouton de
régénération, évite de recomposer les copies et dossiers de retour dont les entrées
n’ont pas changé. Une modification de score ou de remarque ne reconstruit que la
copie concernée ; les changements de documents partagés peuvent concerner toute
la classe. Le premier passage établit les empreintes nécessaires. Les changements de noms
seuls sont suivis séparément : ils ne relancent pas la composition des corrections,
même avant ce premier passage. Enregistrer un nom renomme déjà son dossier de
retour existant et ses fichiers principaux. Les fichiers
manquants sont reconstruits et les échecs sont retentés. Décochez cette case pour
forcer une régénération complète. Le journal signale les copies ignorées.
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.
Le mode **Anot** donne accès aux noms, scores, remarques et à leur régénération
dès la génération initiale, sans lecture manuscrite intermédiaire. Les coupes et
transferts restent réservés à **Bnot/BGnot**, qui disposent des limites exactes
des corps de réponses relus. Les anciens résultats Anot peuvent créer leur état
de rendu lors de la première régénération, sans remplacer leurs scores enregistrés.
## 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.