Intermédiaire 5 : Les conditions de transition¶
Objectif : « rien ne sort de brouillon sans relecture », écrit une fois.
Ce que la déclaration des transitions ne dit pas¶
Le tableau des transitions dit quels passages existent.
Il ne dit pas à quelles conditions ils sont permis : une pièce jointe présente, un quota non dépassé, une relecture faite.
Sans registre, chaque contrôleur redit la règle, et deux chemins menant au même état s'oublient l'un l'autre.
from forge_mvc_workflow import register_condition
def relecture_faite(depart, arrivee, contexte):
if not contexte.get("relu_par"):
return "L'article n'a pas été relu."
return None
register_condition(relecture_faite, from_status="brouillon")
Ce qu'une condition rend¶
| Retour | Sens |
|---|---|
None |
rien à signaler, ce passage est permis |
| une chaîne | le motif du refus, montré à l'utilisateur |
Ne rendez pas un ConditionResult
Ce type est ce que check_conditions vous rend, pas ce qu'une condition doit produire.
Le rendre depuis une condition fait refuser la transition avec « une condition a rendu un verdict illisible » : la valeur n'est pas lisible comme un motif.
Une condition qui lève refuse la transition
Le jour où le service qu'elle interroge tombe, tout passerait sinon.
Le motif dit alors « une condition n'a pas pu être évaluée », et la panne se voit au lieu de s'ouvrir.
La portée se choisit à l'enregistrement
Sans from_status ni to_status, la condition s'applique à toutes les transitions.
Avec l'un des deux, elle s'applique à celles qui le portent : « rien ne sort de brouillon » se déclare une fois, plutôt qu'une fois par transition sortante.
Les consulter¶
from forge_mvc_workflow import check_conditions, ensure_conditions
verdict = check_conditions("brouillon", "publie", contexte)
if not verdict.allowed:
return render("article/form.html", erreurs=verdict.reasons)
ensure_conditions fait le même contrôle et lève au lieu de rendre un verdict, quand l'appelant préfère une exception.
apply_transition les consulte de lui même : vous n'avez pas à les appeler avant lui.
À retenir¶
- Une condition rend
Noneou un motif ; jamais autre chose. - Elle est enregistrée avec sa portée, et toutes les applicables doivent accepter.
apply_transitionles consulte, et un échec de condition refuse.