Clean command

This commit is contained in:
2026-08-22 17:17:30 +02:00
parent 576e3c9452
commit 15d1319374
7 changed files with 436 additions and 6 deletions
+23 -2
View File
@@ -802,8 +802,9 @@ class CopienatorApp(tk.Tk):
variant = self._current_variant()
command = self._make_command()
if variant.dangerous and not messagebox.askyesno(
"Confirmation requise",
"Cette commande réinitialise ou supprime des résultats de correction. Continuer ?",
"Nettoyage irréversible" if step.id == "clean" else "Confirmation requise",
variant.danger_warning
or "Cette commande réinitialise ou supprime des résultats de correction. Continuer ?",
icon="warning",
):
return
@@ -893,6 +894,26 @@ class CopienatorApp(tk.Tk):
if not step_id:
return
status = process_status(return_code, interrupted)
if step_id == "clean" and status == "success":
self._append_console(
f"\n[Terminé — code {return_code}{STATUS_LABELS[status]}]\n"
)
self.info_var.set(
"Nettoyage terminé : la progression précédente a été supprimée."
)
self.active_step_id = None
# Do not recreate .copienator-gui.json after clean removed it.
self.state_store = StateStore()
self._populate_tree()
self._update_controls()
messagebox.showinfo(
"Nettoyage terminé",
"Les fichiers intermédiaires et la progression du GUI ont été "
"supprimés. Les copies traitées, les fichiers textuels de l’énoncé, "
"correction.json, les journaux et les livrables de A Rendre ont "
"été conservés.",
)
return
self.state_store.update_step(step_id, status=status, return_code=return_code)
self.state_store.add_history(
{
+6 -3
View File
@@ -27,12 +27,15 @@ class ProcessRunner:
command: list[str],
cwd: Path,
environment: dict[str, str],
log_path: Path,
log_path: Path | None,
) -> None:
if self.running:
raise RuntimeError("Un processus est déjà en cours")
log_path.parent.mkdir(parents=True, exist_ok=True)
self._log_file = log_path.open("wb")
if log_path is not None:
log_path.parent.mkdir(parents=True, exist_ok=True)
self._log_file = log_path.open("wb")
else:
self._log_file = None
self._interrupted = False
kwargs: dict[str, Any] = {}
+31
View File
@@ -32,6 +32,7 @@ class CommandVariant:
fixed_args: tuple[str, ...] = ()
fixed_args_before_positionals: bool = False
dangerous: bool = False
danger_warning: str | None = None
@dataclass(frozen=True)
@@ -473,6 +474,36 @@ def build_workflow(show_personal_steps: bool) -> list[StepDefinition]:
personal=True,
optional=True,
),
StepDefinition(
"clean",
"Archivage",
"Nettoyer les fichiers intermédiaires",
"Supprime définitivement les fichiers permettant de reprendre le parcours. "
"Conserve les PDF traités, les fichiers textuels de l’énoncé, correction.json, "
"les journaux, ainsi que les images et score.json de A Rendre.",
(
python(
"default",
"Nettoyage définitif",
"clean",
fixed_args=("--yes",),
dangerous=True,
danger_warning=(
"Le nettoyage est irréversible.\n\n"
"Toute la progression du GUI et les fichiers intermédiaires "
"seront supprimés. Il ne sera plus possible de reprendre une "
"étape sans régénérer ses données.\n\n"
"Les PDF traités, les fichiers textuels de l’énoncé, "
"correction.json, les journaux, ainsi que les images et "
"score.json de A Rendre seront conservés.\n\n"
"Continuer ?"
),
),
),
arguments=(arg_target("Dossier de l’évaluation"),),
optional=True,
requires=("Copies", "correction.json", "A Rendre"),
),
]
return [step for step in steps if show_personal_steps or not step.personal]