Source code for coaster.docflow

# -*- coding: utf-8 -*-

"""
Document workflows
==================

Coaster provides versions of the main Docflow_ classes where workflow
exceptions map to HTTP 403 Forbidden (via werkzeug.exceptions.Forbidden_).

.. _Docflow: http://docflow.readthedocs.org/
.. _werkzeug.exceptions.Forbidden:
    http://werkzeug.readthedocs.org/en/latest/exceptions/#werkzeug.exceptions.Forbidden
"""

from __future__ import absolute_import

from flask import g
from werkzeug.exceptions import Forbidden

import docflow

from .auth import current_auth

__all__ = [
    'WorkflowStateException',
    'WorkflowTransitionException',
    'WorkflowPermissionException',
    'WorkflowState',
    'WorkflowStateGroup',
    'InteractiveTransition',
    'DocumentWorkflow',
]


[docs]class WorkflowStateException(docflow.WorkflowStateException, Forbidden): pass
[docs]class WorkflowTransitionException(docflow.WorkflowTransitionException, Forbidden): pass
[docs]class WorkflowPermissionException(docflow.WorkflowPermissionException, Forbidden): pass
[docs]class WorkflowState(docflow.WorkflowState): __doc__ = docflow.WorkflowState.__doc__ exception_state = WorkflowStateException exception_transition = WorkflowTransitionException exception_permission = WorkflowPermissionException
[docs]class WorkflowStateGroup(docflow.WorkflowStateGroup): __doc__ = docflow.WorkflowStateGroup.__doc__ exception_state = WorkflowStateException exception_transition = WorkflowTransitionException exception_permission = WorkflowPermissionException
[docs]class InteractiveTransition(docflow.InteractiveTransition): __doc__ = docflow.InteractiveTransition.__doc__ def __init__(self, workflow): super(InteractiveTransition, self).__init__(workflow) if hasattr(self, 'formclass'): self.form = self.formclass(obj=self.document)
[docs] def validate(self): """Validate self.form, assuming Flask-WTF Form""" return self.form.validate_on_submit()
[docs]class DocumentWorkflow(docflow.DocumentWorkflow): __doc__ = docflow.DocumentWorkflow.__doc__ exception_state = WorkflowStateException
[docs] def permissions(self): """ Permissions for this workflow. Plays nice with :meth:`coaster.views.load_models` and :class:`coaster.sqlalchemy.PermissionMixin` to determine the available permissions to the current user. """ perms = set(super(DocumentWorkflow, self).permissions()) if g: if hasattr(g, 'permissions'): perms.update(g.permissions or []) if hasattr(self.document, 'permissions'): perms = self.document.permissions(current_auth.actor, perms) return perms