This app creates "workflows", which are long and complex interactions from the user. Workflows are composed of multiple steps. At each step the user inputs some information. The content of one step may impact following steps. The WorkflowStep object is the abstract type for all the workflow steps. Important attributes and methods: template - the django template to use when rendering this step valid - the status code from WorkflowStepStatus get_context() - returns a dictionary that is used when rendering this step's template You should always call super's get_context and add / overwrite any data into that dictionary post(data, user) - this method is called when the step is POST'd to. data is from the request object, suitable for a Form's constructor Repository Each step has a reference to a shared repository (self.repo). The repo is a key-value store that allows the steps to share data Steps render based on the current state of the repo. For example, a step may get information about each host the user said they want and ask for additional input for each machine. Because the steps render based on what is in the repo, a user can easily go back to a previous step and change some data. This data will change in the repo and affect later steps accordingly. Everything stored in the repo is temporary. After a workflow has been completed, the repo is translated into Django models and saved to the database.