Aller au contenu

Avancé 4 : L'historique des transitions

Objectif : répondre à « qui a publié cet article, et quand ».

Ce que le statut courant ne dit pas

Une colonne statut porte l'état, jamais le chemin.
Un article passé de brouillon à publié puis archivé ressemble, dans la table, à un article créé archivé.

L'historique est une table : il lui faut donc une base, et de quoi la faire évoluer.

pip install forge-mvc-sqlite forge-mvc-entities
forge db:config
forge db:init
forge workflow:init
forge migration:apply

Un projet qui a déjà une base saute les trois premières commandes.
La table workflow_history garde ensuite une ligne par passage.

from forge_mvc_workflow import record_transition

record_transition(
    "Article", article_id, "publie",
    from_status="brouillon",
    actor_kind="user", actor_id=utilisateur.id,
    comment="Relu par la rédaction",
)

Le relire

from forge_mvc_workflow import history_for, last_transition

for passage in history_for("Article", article_id):
    print(passage.from_status, "vers", passage.to_status, passage.created_at)

dernier = last_transition("Article", article_id)

history_for rend la suite complète, du plus ancien au plus récent.
last_transition rend le dernier passage, ou None si l'entité n'en a aucun.

Forge n'enregistre pas à votre place

apply_transition ne consulte pas l'historique et n'y écrit pas.

C'est délibéré : Forge n'écrit jamais dans votre code, et toutes les applications ne veulent pas d'une trace. Appelez record_transition dans votre commit, là où l'écriture a lieu.

Écrivez la trace dans la même transaction que le statut

Sinon la trace ment : le statut change et l'historique reste en arrière, ou l'inverse.

Le commit d'apply_transition est l'endroit prévu pour que les deux écritures aillent ensemble.

L'acteur est en deux parties, et peut manquer

actor_kind et actor_id disent qui a agi, un utilisateur, une tâche de fond, un import.

Les laisser vides est licite : un passage automatique n'a pas d'auteur, et inventer « system » masquerait la différence.

À retenir

  • L'historique est une table à part, provisionnée par workflow:init.
  • L'écriture est explicite, et doit accompagner celle du statut.
  • L'acteur peut légitimement manquer.

Étape suivante

Bilan du niveau avancé