'Verifies that all required data is present in the context.
It also calls the ``validate`` method to allow for finer-grained checks
on the context data.'

def is_valid(self):

    missing = (self.depends_on - set(self.context.keys()))
    if missing:
        raise exceptions.WorkflowValidationError(('Unable    to    complete    the    workflow.    The    values    %s    are    required    but    not    present.' % ',    '.join(missing)))
    steps_valid = True
    for step in self.steps:
        if (not step.action.is_valid()):
            steps_valid = False
            step.has_errors = True
    if (not steps_valid):
        return steps_valid
    return self.validate(self.context)
