# 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 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. 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.