149 lines
8.3 KiB
Markdown
149 lines
8.3 KiB
Markdown
# 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.
|