Recorrection GUI step ; LaTeX issues debugging
This commit is contained in:
1 parent
2d0f7a219f
commit
48602c24f1
12 files changed
+306
-8
No files matched your search
@@ -30,6 +30,7 @@ from .scores import ScoreEditorPanel
|
||||
from .notifications import notify_desktop
|
||||
from .syncthing import SyncthingPanel
|
||||
from .manual_resolution import ManualResolutionPanel
|
||||
from .recorrection import prepare_selection_file
|
||||
from .refaire import SECTION as REFAIRE_SECTION
|
||||
from .refaire import (
|
||||
RefaireSelection,
|
||||
@@ -930,6 +931,14 @@ class CopienatorApp(tk.Tk):
|
||||
self.arg_vars['target'].trace_add('write', lambda *_args: self._refresh_persp_inventory())
|
||||
self._refresh_persp_inventory()
|
||||
|
||||
if step.id == "prepare_recorrection":
|
||||
self.edit_recorrection_button = ttk.Button(
|
||||
self.form, text="Ouvrir refaire.json (avec exemples)",
|
||||
command=self._edit_recorrection,
|
||||
)
|
||||
self.edit_recorrection_button.grid(row=row, column=0, columnspan=2, sticky="w", pady=8)
|
||||
row += 1
|
||||
|
||||
if step.id == "manual_resolution":
|
||||
def manual_evaluation():
|
||||
target = self.arg_vars.get("target")
|
||||
@@ -1117,6 +1126,7 @@ class CopienatorApp(tk.Tk):
|
||||
"cutleft",
|
||||
"labels",
|
||||
"plotting",
|
||||
"splitting",
|
||||
}
|
||||
if step.id in copy_selection_steps:
|
||||
evaluation = self.evaluation
|
||||
@@ -1310,6 +1320,16 @@ class CopienatorApp(tk.Tk):
|
||||
except (OSError, RuntimeError) as exc:
|
||||
messagebox.showerror("Ouverture impossible", str(exc))
|
||||
|
||||
def _edit_recorrection(self) -> None:
|
||||
if self.evaluation is None:
|
||||
return
|
||||
try:
|
||||
path = prepare_selection_file(self.evaluation)
|
||||
except OSError as exc:
|
||||
messagebox.showerror("Préparation impossible", str(exc))
|
||||
return
|
||||
self._open_desktop_path(path, "fichier refaire.json")
|
||||
|
||||
def _select_variant(self, index: int) -> None:
|
||||
if not self.current_step or index < 0:
|
||||
return
|
||||
@@ -1546,6 +1566,15 @@ class CopienatorApp(tk.Tk):
|
||||
if step.id == "refaire_selection":
|
||||
self._save_refaire_selection()
|
||||
return
|
||||
if step.id == "prepare_recorrection":
|
||||
try:
|
||||
load_selection(evaluation)
|
||||
except (OSError, ValueError, TypeError) as exc:
|
||||
messagebox.showerror("Sélection à vérifier", str(exc))
|
||||
return
|
||||
self._mark_step("success")
|
||||
self._select_refaire_correction()
|
||||
return
|
||||
if step.section == REFAIRE_SECTION:
|
||||
try:
|
||||
self._refaire_selection()
|
||||
|
||||
@@ -0,0 +1,25 @@
|
||||
"""Editable examples for the optional correction redo step."""
|
||||
|
||||
from pathlib import Path
|
||||
|
||||
from copienator import atomic_write_text
|
||||
|
||||
|
||||
EXAMPLES = """// Exemples de sélection pour refaire la correction
|
||||
// Les lignes commençant par // sont des commentaires et sont ignorées.
|
||||
// Modifiez la liste JSON ci-dessous, puis enregistrez le fichier.
|
||||
// Une copie entière : [["Copie46", []]]
|
||||
// Certaines questions : [["Copie46", ["II)8)", "II)9)"]]
|
||||
// Plusieurs copies : [["Copie46", []], ["Copie03", ["Ex 1"]]]
|
||||
// Utilisez les noms exacts des copies et des labels de votre évaluation.
|
||||
// [] après une copie signifie toutes ses questions ; [] seul ne sélectionne rien.
|
||||
// Séparez les entrées par des virgules, sans virgule après la dernière.
|
||||
"""
|
||||
|
||||
|
||||
def prepare_selection_file(evaluation: Path) -> Path:
|
||||
path = evaluation / "refaire.json"
|
||||
existing = path.read_text(encoding="utf-8") if path.exists() else "[]\n"
|
||||
if not existing.startswith(EXAMPLES):
|
||||
atomic_write_text(path, EXAMPLES + existing)
|
||||
return path
|
||||
@@ -371,12 +371,12 @@ def build_workflow(show_personal_steps: bool) -> list[StepDefinition]:
|
||||
"splitting",
|
||||
"Labels et regroupement",
|
||||
"Découper les réponses par question",
|
||||
"Découpe les copies à partir des coordonnées de labels vérifiées.",
|
||||
"Découpe les copies à partir des coordonnées de labels vérifiées. "
|
||||
"Ciblez une copie avec le sélecteur ou tout le dossier, puis cliquez sur Exécuter.",
|
||||
(python("default", "Découpage", "split-answers"),),
|
||||
arguments=(arg_target(),),
|
||||
requires=("Copies",),
|
||||
artifacts=("Copies/Copie*/*",),
|
||||
auto_start_first_visit=True,
|
||||
),
|
||||
StepDefinition(
|
||||
"crop_exercise_bottoms",
|
||||
@@ -511,6 +511,19 @@ def build_workflow(show_personal_steps: bool) -> list[StepDefinition]:
|
||||
requires=("manual_resolutions.txt", "correction.json"),
|
||||
skip_without_manual_conflicts=True,
|
||||
),
|
||||
StepDefinition(
|
||||
"prepare_recorrection",
|
||||
"Correction",
|
||||
"Choisir des copies à recorriger",
|
||||
"Facultatif : ouvrez refaire.json et indiquez les copies entières ou les questions à recorriger. "
|
||||
"Les exemples commentés expliquent la syntaxe. Enregistrez le fichier, puis marquez cette étape terminée : "
|
||||
"vous reviendrez à Correction avec --refaire sélectionné, sans lancement automatique. "
|
||||
"Les corrections sélectionnées seront remplacées ; celles des autres copies seront conservées. "
|
||||
"Si vous avez modifié les découpes, régénérez les réponses avant la recorrection. "
|
||||
"Ignorez cette étape si aucune reprise n’est nécessaire.",
|
||||
(manual("default"),),
|
||||
optional=True,
|
||||
),
|
||||
StepDefinition(
|
||||
"post_correction",
|
||||
"Correction",
|
||||
|
||||
Reference in new issue
Block a user