---
url: "https://vueda.dev/v3/reference/api/py/vueda.workflow.models.md"
title: "workflow.models"
---

# workflow.models

## Overview

Workflow state machine models: workflows, states, transitions, permissions, and object state tracking.

## Classes

- [InitialState](/v3/reference/api/py/vueda.workflow.models/InitialState.md)
- [ObjectState](/v3/reference/api/py/vueda.workflow.models/ObjectState.md)
- [ObjectStateProxy](/v3/reference/api/py/vueda.workflow.models/ObjectStateProxy.md)
- [State](/v3/reference/api/py/vueda.workflow.models/State.md)
- [StatePermission](/v3/reference/api/py/vueda.workflow.models/StatePermission.md)
- [Transition](/v3/reference/api/py/vueda.workflow.models/Transition.md)
- [TransitionPermission](/v3/reference/api/py/vueda.workflow.models/TransitionPermission.md)
- [TransitionSource](/v3/reference/api/py/vueda.workflow.models/TransitionSource.md)
- [Workflow](/v3/reference/api/py/vueda.workflow.models/Workflow.md)
- [WorkflowModelMethods](/v3/reference/api/py/vueda.workflow.models/WorkflowModelMethods.md)
- [WorkflowPermission](/v3/reference/api/py/vueda.workflow.models/WorkflowPermission.md)

## `ensure_object_state` {#ensure_object_state}

``post_save`` receiver that gives a saved workflow object its ``ObjectState`` if it has none.

It receives every model's saves, including a proxy's, whose sender is the proxy class. A raw save
loads a fixture, which carries its own object state rows, so it creates nothing.

### Signature {#ensure_object_state-signature}

`ensure_object_state(sender, instance, raw, kwargs)`

#### Parameters {#ensure_object_state-parameters}

| Name | Type | Required | Default | Description |
| --- | --- | --- | --- | --- |
| <span id="ensure_object_state-param-sender">sender</span> |  | yes |  |  |
| <span id="ensure_object_state-param-instance">instance</span> |  | yes |  |  |
| <span id="ensure_object_state-param-raw">raw</span> |  | no | `False` |  |
| <span id="ensure_object_state-param-kwargs">kwargs</span> |  | no |  |  |

### Source {#ensure_object_state-source}

`server/vueda/workflow/models.py:1110`

## `get_workflow_for_model` {#get_workflow_for_model}

Return the ``Workflow`` of ``model``, which enables ``class Vueda.Workflow``.

Every read of a workflow model's definition goes through here, so a missing one raises
``WorkflowNotConfiguredError`` wherever it is first needed instead of reading as "no workflow".
A proxy resolves to its concrete model's definition.

### Signature {#get_workflow_for_model-signature}

`get_workflow_for_model(model)`

#### Parameters {#get_workflow_for_model-parameters}

| Name | Type | Required | Default | Description |
| --- | --- | --- | --- | --- |
| <span id="get_workflow_for_model-param-model">model</span> |  | yes |  |  |

#### Returns {#get_workflow_for_model-returns}

`vueda.workflow.models.Workflow`

### Source {#get_workflow_for_model-source}

`server/vueda/workflow/models.py:571`

## `object_state_events` {#object_state_events}

Name the workflow state changes of ``instance`` for its history.

These are the ``update`` events of the object's ``ObjectState`` row. The row's ``insert`` records
the object's initial state rather than a transition, so history leaves it out. Returns ``None``
when the model does not enable workflow or the object has no ``ObjectState`` row.

### Signature {#object_state_events-signature}

`object_state_events(instance)`

#### Parameters {#object_state_events-parameters}

| Name | Type | Required | Default | Description |
| --- | --- | --- | --- | --- |
| <span id="object_state_events-param-instance">instance</span> |  | yes |  |  |

### Source {#object_state_events-source}

`server/vueda/workflow/models.py:584`

## `objects_without_object_state` {#objects_without_object_state}

Return the objects of ``model`` that have no ``ObjectState`` row in ``workflow``.

Read through the base manager, so a default manager that hides rows does not hide them here. An
object in this queryset has no current state, which leaves it out of state filters and state
grants and makes its transitions fail. ``backfillworkflowstates`` gives each one the initial state.

### Signature {#objects_without_object_state-signature}

`objects_without_object_state(model, workflow)`

#### Parameters {#objects_without_object_state-parameters}

| Name | Type | Required | Default | Description |
| --- | --- | --- | --- | --- |
| <span id="objects_without_object_state-param-model">model</span> |  | yes |  |  |
| <span id="objects_without_object_state-param-workflow">workflow</span> |  | yes |  |  |

### Source {#objects_without_object_state-source}

`server/vueda/workflow/models.py:615`

## Source

`server/vueda/workflow/models.py`
