Remove `Arguments supplémentaires' boxes

This commit is contained in:
2026-09-09 18:11:00 +02:00
parent 0a167072ed
commit f7b3689f23
8 changed files with 277 additions and 20 deletions
+83 -12
View File
@@ -7,6 +7,8 @@ from collections.abc import Iterable
from dataclasses import dataclass
from pathlib import Path
from copienator.configuration import ALWAYS_CROP
EVALUATION = "${evaluation}"
@@ -33,6 +35,7 @@ class CommandVariant:
fixed_args_before_positionals: bool = False
dangerous: bool = False
danger_warning: str | None = None
supports_verbose: bool = False
@dataclass(frozen=True)
@@ -50,6 +53,8 @@ class StepDefinition:
auto_start_first_visit: bool = False
skip_for_live_correction: bool = False
skip_without_manual_conflicts: bool = False
extra_arguments_help: str = ""
extra_arguments_variants: tuple[str, ...] = ()
@property
def is_manual(self) -> bool:
@@ -68,9 +73,16 @@ def arg_target(help_text: str = "Dossier d’évaluation ou fichier à traiter")
def build_workflow(show_personal_steps: bool) -> list[StepDefinition]:
python = lambda ident, label, script, **kwargs: CommandVariant(
ident, label, script, "python", **kwargs
)
def python(ident, label, script, **kwargs):
supports_verbose = kwargs.pop("supports_verbose", True)
return CommandVariant(
ident,
label,
script,
"python",
supports_verbose=supports_verbose,
**kwargs,
)
manual = lambda ident, label="Étape manuelle": CommandVariant(
ident, label, None, "manual"
)
@@ -111,7 +123,7 @@ def build_workflow(show_personal_steps: bool) -> list[StepDefinition]:
"statement_groups", "Prétraitement de l’énoncé", "Regrouper les questions avec Gemini",
"Facultatif après la génération : remplace les groupes par exercice par des groupes "
"proposés par Gemini, en conservant les labels, les énoncés, les solutions et les barèmes.",
(CommandVariant("default", "Groupes Gemini", "statement", fixed_args=("--groups-only",)),),
(python("default", "Groupes Gemini", "statement", fixed_args=("--groups-only",)),),
arguments=(arg_target("Dossier de l’évaluation"),),
optional=True, personal=True, requires=("labels", "Text2", "Sol2"),
),
@@ -119,7 +131,7 @@ def build_workflow(show_personal_steps: bool) -> list[StepDefinition]:
"statement_persp", "Prétraitement de l’énoncé", "Remplacer les barèmes par Gemini",
"Facultatif : remplace Persp par des barèmes Gemini sur 4 points, pour les groupes actuels. "
"Les énoncés et les solutions personnels sont conservés.",
(CommandVariant("default", "Barèmes Gemini", "statement", fixed_args=("--persp-only",)),),
(python("default", "Barèmes Gemini", "statement", fixed_args=("--persp-only",)),),
arguments=(arg_target("Dossier de l’évaluation"),),
optional=True, personal=True, requires=("labels", "label_groups", "Text2", "Sol2"),
),
@@ -145,6 +157,7 @@ def build_workflow(show_personal_steps: bool) -> list[StepDefinition]:
"python",
("rotate",),
fixed_args_before_positionals=True,
supports_verbose=True,
),
),
arguments=(arg_target("Dossier de l’évaluation"),),
@@ -163,6 +176,7 @@ def build_workflow(show_personal_steps: bool) -> list[StepDefinition]:
"python",
("rename",),
fixed_args_before_positionals=True,
supports_verbose=True,
),
),
arguments=(arg_target("Dossier de l’évaluation"),),
@@ -188,6 +202,7 @@ def build_workflow(show_personal_steps: bool) -> list[StepDefinition]:
ArgumentSpec("workers", "Copies traitées en parallèle", "int", "--workers", default=5)),
optional=True,
requires=("Copies",),
auto_start_first_visit=ALWAYS_CROP,
),
StepDefinition(
"cutleft",
@@ -215,6 +230,10 @@ def build_workflow(show_personal_steps: bool) -> list[StepDefinition]:
),
requires=("labels", "Copies", "Cutleft"),
artifacts=("Copies/*.json",),
extra_arguments_help=(
"PDF de copie ou images Cutleft supplémentaires de cette évaluation, "
"séparés par des espaces. Mettez entre guillemets les chemins contenant des espaces."
),
),
StepDefinition(
"plotting",
@@ -257,6 +276,7 @@ def build_workflow(show_personal_steps: bool) -> list[StepDefinition]:
),
optional=True,
requires=("Copies/Copie*/*.pdf",),
auto_start_first_visit=ALWAYS_CROP,
),
StepDefinition(
"grouping",
@@ -289,12 +309,29 @@ def build_workflow(show_personal_steps: bool) -> list[StepDefinition]:
),
arguments=(
arg_target("Évaluation ou image Group_X.jpg"),
ArgumentSpec("overwrite", "Écraser les corrections existantes", "bool", "--overwrite", variants=("live",)),
ArgumentSpec("limit", "Limite dappels Pro", "int", "--limit", variants=("live",)),
ArgumentSpec(
"overwrite",
"Écraser les corrections existantes",
"bool",
"--overwrite",
variants=("live", "batch", "hybrid", "refaire"),
),
ArgumentSpec(
"limit",
"Limite dappels Pro",
"int",
"--limit",
variants=("live", "hybrid", "refaire"),
),
ArgumentSpec("batch_from", "Premier label envoyé en batch", "text", "--batch-from", variants=("hybrid",)),
),
requires=("Par label", "Persp", "labels"),
artifacts=("correction.json", "batch_requests_*.jsonl"),
extra_arguments_help=(
"Images Group_X.jpg supplémentaires de cette évaluation, séparées par des espaces. "
"Mettez entre guillemets les chemins contenant des espaces."
),
extra_arguments_variants=("live", "batch", "hybrid", "refaire"),
),
StepDefinition(
"submit_batches",
@@ -313,7 +350,16 @@ def build_workflow(show_personal_steps: bool) -> list[StepDefinition]:
"Consulter l’état des batchs",
"Affiche les jobs Gemini en cours. Lidentifiant de téléchargement est facultatif.",
(python("default", "État des batchs", "batch-status"),),
arguments=(ArgumentSpec("download", "Télécharger le job", "text", "--download"),),
arguments=(
ArgumentSpec("download", "Télécharger le job", "text", "--download"),
ArgumentSpec(
"output",
"Fichier JSONL de destination",
"path",
"--output",
help="Utilisé avec un identifiant de téléchargement.",
),
),
optional=True,
skip_for_live_correction=True,
),
@@ -360,7 +406,7 @@ def build_workflow(show_personal_steps: bool) -> list[StepDefinition]:
arguments=(
arg_target("Dossier de l’évaluation"),
ArgumentSpec("overwrite", "Écraser les sorties", "bool", "--overwrite"),
ArgumentSpec("refaire", "Mode refaire", "bool", "--refaire", variants=("checks",)),
ArgumentSpec("refaire", "Mode refaire", "bool", "--refaire", variants=("checks", "grouped")),
),
requires=("correction.json",),
artifacts=("Anot", "Bnot", "BGnot"),
@@ -424,6 +470,15 @@ def build_workflow(show_personal_steps: bool) -> list[StepDefinition]:
arg_target("Dossier de l’évaluation"),
ArgumentSpec("update_score", "Réappliquer les score.json", "bool", "--update-score"),
ArgumentSpec("refaire", "Mode refaire", "bool", "--refaire", variants=("grouped",)),
ArgumentSpec(
"annotation_dir",
"Passage principal du mode refaire",
"choice",
"--annotation-dir",
default="BGnot",
choices=("BGnot", "Bnot", "Anot"),
variants=("grouped",),
),
),
),
StepDefinition(
@@ -466,7 +521,7 @@ def build_workflow(show_personal_steps: bool) -> list[StepDefinition]:
"Étapes personnelles",
"Mettre à jour le fichier ODS",
"Transfère les scores, avec la possibilité de n’écrire que leur somme.",
(python("default", "Mise à jour ODS", "update-ods"),),
(python("default", "Mise à jour ODS", "update-ods", supports_verbose=False),),
arguments=(
arg_target("Dossier de l’évaluation"),
ArgumentSpec("sum", "Écrire seulement la somme", "bool", "--sum"),
@@ -494,7 +549,7 @@ def build_workflow(show_personal_steps: bool) -> list[StepDefinition]:
"Étapes personnelles",
"Ajouter le score final",
"Génère les fichiers de diffusion avec le score final.",
(python("default", "Score final", "add-final-score"),),
(python("default", "Score final", "add-final-score", supports_verbose=False),),
arguments=(arg_target("Dossier de l’évaluation"),),
personal=True,
),
@@ -540,6 +595,12 @@ def build_workflow(show_personal_steps: bool) -> list[StepDefinition]:
"Continuer ?"
),
),
python(
"dry_run",
"Prévisualiser sans supprimer",
"clean",
fixed_args=("--dry-run",),
),
),
arguments=(arg_target("Dossier de l’évaluation"),),
optional=True,
@@ -580,7 +641,14 @@ def build_refaire_workflow() -> list[StepDefinition]:
requirements += ("BRnot",)
steps.append(StepDefinition(
f"refaire_{suffix}", SECTION, title, description,
(CommandVariant("default", title, program, "python" if program else "manual", flags),),
(CommandVariant(
"default",
title,
program,
"python" if program else "manual",
flags,
supports_verbose=program is not None,
),),
arguments=arguments, optional=optional, requires=requirements,
))
return steps
@@ -597,6 +665,7 @@ def build_command(
values: dict[str, object],
evaluation_arg: str,
extra_arguments: str = "",
verbose: bool = False,
) -> list[str]:
if variant.kind == "manual" or not variant.program:
return []
@@ -633,6 +702,8 @@ def build_command(
if not variant.fixed_args_before_positionals:
command.extend(variant.fixed_args)
command.extend(options)
if verbose and variant.supports_verbose:
command.append("--verbose")
if extra_arguments.strip():
command.extend(shlex.split(extra_arguments, posix=os.name != "nt"))
return command