Initial commit for finalisation web interface
This commit is contained in:
1 parent
b295f871a7
commit
c36642e8de
33 files changed
+2745
-138
No files matched your search
@@ -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.
|
||||
Reference in new issue
Block a user