Multi-Workflow Support for Plone#
collective.multiworkflow lets a behavior add workflows to a content type's workflow chain, and carries those workflows through the catalog, the REST API, and Volto.
When a content type provides a participating behavior, this add-on appends one or more workflows to that type's chain.
The chain configured for the type is never replaced, review_state never changes meaning, and content that does not provide the behavior is left completely untouched.
from collective.multiworkflow import api as mw_api
mw_api.get_states(member)
{'simple_publication_workflow': 'published', 'membership_workflow': 'active'}
Warning
This documentation was written with Claude Opus 5, following the Plone documentation style skill, and reviewed by a human being.
Where to start#
Give a content type a second workflow and drive it end to end.
Install the package, declare a contribution, search by an additional state.
Why chains, why behaviors, why review_state is left alone.
The Python API, the ZCML directive, the catalog index, the REST API, Volto.
What it gives you#
Behavior-driven assignment. Enable a behavior on a type and its workflows come along. No per-type chain editing, and no workflow on content that should not have it.
review_state untouched.
Each additional workflow drives a state variable of its own, so Plone's publication workflow keeps working exactly as before.
Workflow-aware helpers.
Read and drive per-workflow state with plone.api-style functions whose defaults behave identically to the API you already use.
One catalog index for the whole chain.
Additional states are queryable like any other index, and existing review_state collections keep working.
REST API and Volto.
@workflow gains a per-workflow breakdown, @history reports every workflow's transitions tagged with the workflow that recorded them, and the Volto components render each additional workflow—or nothing at all, on content that has none.
What is not in scope#
Placeful workflows, sub-workflows, and any arbitration between workflows managing the same permission. About the scope of this package explains why each exclusion is deliberate.