cubicweb/wfutils.py
author Denis Laxalde <denis.laxalde@logilab.fr>
Thu, 21 Mar 2019 14:33:54 +0100
changeset 12530 9d88e1177c35
parent 12355 c703dc95c82e
child 12567 26744ad37953
permissions -rw-r--r--
Remove Twisted web server Twisted web server is not used anymore and has been superseded by pyramid many years ago. Furthermore, our usage is not compatible with Python 3. So we drop the "etwist" sub-package. As a consequence, "all-in-one" configuration type gets dropped as it was Twisted-specific. We resurrect it in cubicweb/pyramid/config.py by only keeping options used by the "pyramid". Similarly, we introduce a AllInOneCreateHandler in cubicweb/pyramid/pyramidctl.py that is basically the one that lived in cubicweb/etwist/twctl.py and is used to create the "all-in-one" instance. Added a TODO here about "pyramid.ini" that could be generated at the end of bootstrap() method. In cubicweb/devtools/httptest.py, CubicWebServerTC is now equivalent to CubicWebWsgiTC and the latter is dropped.
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
11963
64ecd4d96ac7 [workflow] Utilities for declarative definition of workflows
Christophe de Vienne <christophe@unlish.com>
parents:
diff changeset
     1
# copyright 2017 LOGILAB S.A. (Paris, FRANCE), all rights reserved.
64ecd4d96ac7 [workflow] Utilities for declarative definition of workflows
Christophe de Vienne <christophe@unlish.com>
parents:
diff changeset
     2
# contact http://www.logilab.fr/ -- mailto:contact@logilab.fr
64ecd4d96ac7 [workflow] Utilities for declarative definition of workflows
Christophe de Vienne <christophe@unlish.com>
parents:
diff changeset
     3
#
64ecd4d96ac7 [workflow] Utilities for declarative definition of workflows
Christophe de Vienne <christophe@unlish.com>
parents:
diff changeset
     4
# This file is part of CubicWeb.
64ecd4d96ac7 [workflow] Utilities for declarative definition of workflows
Christophe de Vienne <christophe@unlish.com>
parents:
diff changeset
     5
#
64ecd4d96ac7 [workflow] Utilities for declarative definition of workflows
Christophe de Vienne <christophe@unlish.com>
parents:
diff changeset
     6
# CubicWeb is free software: you can redistribute it and/or modify it under the
64ecd4d96ac7 [workflow] Utilities for declarative definition of workflows
Christophe de Vienne <christophe@unlish.com>
parents:
diff changeset
     7
# terms of the GNU Lesser General Public License as published by the Free
64ecd4d96ac7 [workflow] Utilities for declarative definition of workflows
Christophe de Vienne <christophe@unlish.com>
parents:
diff changeset
     8
# Software Foundation, either version 2.1 of the License, or (at your option)
64ecd4d96ac7 [workflow] Utilities for declarative definition of workflows
Christophe de Vienne <christophe@unlish.com>
parents:
diff changeset
     9
# any later version.
64ecd4d96ac7 [workflow] Utilities for declarative definition of workflows
Christophe de Vienne <christophe@unlish.com>
parents:
diff changeset
    10
#
64ecd4d96ac7 [workflow] Utilities for declarative definition of workflows
Christophe de Vienne <christophe@unlish.com>
parents:
diff changeset
    11
# CubicWeb is distributed in the hope that it will be useful, but WITHOUT
64ecd4d96ac7 [workflow] Utilities for declarative definition of workflows
Christophe de Vienne <christophe@unlish.com>
parents:
diff changeset
    12
# ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
64ecd4d96ac7 [workflow] Utilities for declarative definition of workflows
Christophe de Vienne <christophe@unlish.com>
parents:
diff changeset
    13
# FOR A PARTICULAR PURPOSE.  See the GNU Lesser General Public License for more
64ecd4d96ac7 [workflow] Utilities for declarative definition of workflows
Christophe de Vienne <christophe@unlish.com>
parents:
diff changeset
    14
# details.
64ecd4d96ac7 [workflow] Utilities for declarative definition of workflows
Christophe de Vienne <christophe@unlish.com>
parents:
diff changeset
    15
#
64ecd4d96ac7 [workflow] Utilities for declarative definition of workflows
Christophe de Vienne <christophe@unlish.com>
parents:
diff changeset
    16
# You should have received a copy of the GNU Lesser General Public License along
64ecd4d96ac7 [workflow] Utilities for declarative definition of workflows
Christophe de Vienne <christophe@unlish.com>
parents:
diff changeset
    17
# with CubicWeb.  If not, see <http://www.gnu.org/licenses/>.
64ecd4d96ac7 [workflow] Utilities for declarative definition of workflows
Christophe de Vienne <christophe@unlish.com>
parents:
diff changeset
    18
"""Workflow setup utilities.
64ecd4d96ac7 [workflow] Utilities for declarative definition of workflows
Christophe de Vienne <christophe@unlish.com>
parents:
diff changeset
    19
64ecd4d96ac7 [workflow] Utilities for declarative definition of workflows
Christophe de Vienne <christophe@unlish.com>
parents:
diff changeset
    20
These functions work with a declarative workflow definition:
64ecd4d96ac7 [workflow] Utilities for declarative definition of workflows
Christophe de Vienne <christophe@unlish.com>
parents:
diff changeset
    21
64ecd4d96ac7 [workflow] Utilities for declarative definition of workflows
Christophe de Vienne <christophe@unlish.com>
parents:
diff changeset
    22
.. code-block:: python
64ecd4d96ac7 [workflow] Utilities for declarative definition of workflows
Christophe de Vienne <christophe@unlish.com>
parents:
diff changeset
    23
64ecd4d96ac7 [workflow] Utilities for declarative definition of workflows
Christophe de Vienne <christophe@unlish.com>
parents:
diff changeset
    24
        {
64ecd4d96ac7 [workflow] Utilities for declarative definition of workflows
Christophe de Vienne <christophe@unlish.com>
parents:
diff changeset
    25
            'etypes': 'CWGroup',
64ecd4d96ac7 [workflow] Utilities for declarative definition of workflows
Christophe de Vienne <christophe@unlish.com>
parents:
diff changeset
    26
            'default': True,
64ecd4d96ac7 [workflow] Utilities for declarative definition of workflows
Christophe de Vienne <christophe@unlish.com>
parents:
diff changeset
    27
            'initial_state': u'draft',
64ecd4d96ac7 [workflow] Utilities for declarative definition of workflows
Christophe de Vienne <christophe@unlish.com>
parents:
diff changeset
    28
            'states': [u'draft', u'published'],
64ecd4d96ac7 [workflow] Utilities for declarative definition of workflows
Christophe de Vienne <christophe@unlish.com>
parents:
diff changeset
    29
            'transitions': {
64ecd4d96ac7 [workflow] Utilities for declarative definition of workflows
Christophe de Vienne <christophe@unlish.com>
parents:
diff changeset
    30
                u'publish': {
64ecd4d96ac7 [workflow] Utilities for declarative definition of workflows
Christophe de Vienne <christophe@unlish.com>
parents:
diff changeset
    31
                    'fromstates': u'draft',
64ecd4d96ac7 [workflow] Utilities for declarative definition of workflows
Christophe de Vienne <christophe@unlish.com>
parents:
diff changeset
    32
                    'tostate': u'published',
64ecd4d96ac7 [workflow] Utilities for declarative definition of workflows
Christophe de Vienne <christophe@unlish.com>
parents:
diff changeset
    33
                    'requiredgroups': u'managers'
64ecd4d96ac7 [workflow] Utilities for declarative definition of workflows
Christophe de Vienne <christophe@unlish.com>
parents:
diff changeset
    34
                    'conditions': (
64ecd4d96ac7 [workflow] Utilities for declarative definition of workflows
Christophe de Vienne <christophe@unlish.com>
parents:
diff changeset
    35
                        'U in_group X',
64ecd4d96ac7 [workflow] Utilities for declarative definition of workflows
Christophe de Vienne <christophe@unlish.com>
parents:
diff changeset
    36
                        'X owned_by U'
64ecd4d96ac7 [workflow] Utilities for declarative definition of workflows
Christophe de Vienne <christophe@unlish.com>
parents:
diff changeset
    37
                    )
64ecd4d96ac7 [workflow] Utilities for declarative definition of workflows
Christophe de Vienne <christophe@unlish.com>
parents:
diff changeset
    38
                }
64ecd4d96ac7 [workflow] Utilities for declarative definition of workflows
Christophe de Vienne <christophe@unlish.com>
parents:
diff changeset
    39
            }
64ecd4d96ac7 [workflow] Utilities for declarative definition of workflows
Christophe de Vienne <christophe@unlish.com>
parents:
diff changeset
    40
        }
64ecd4d96ac7 [workflow] Utilities for declarative definition of workflows
Christophe de Vienne <christophe@unlish.com>
parents:
diff changeset
    41
64ecd4d96ac7 [workflow] Utilities for declarative definition of workflows
Christophe de Vienne <christophe@unlish.com>
parents:
diff changeset
    42
.. autofunction:: setup_workflow
64ecd4d96ac7 [workflow] Utilities for declarative definition of workflows
Christophe de Vienne <christophe@unlish.com>
parents:
diff changeset
    43
.. autofunction:: cleanupworkflow
64ecd4d96ac7 [workflow] Utilities for declarative definition of workflows
Christophe de Vienne <christophe@unlish.com>
parents:
diff changeset
    44
"""
64ecd4d96ac7 [workflow] Utilities for declarative definition of workflows
Christophe de Vienne <christophe@unlish.com>
parents:
diff changeset
    45
64ecd4d96ac7 [workflow] Utilities for declarative definition of workflows
Christophe de Vienne <christophe@unlish.com>
parents:
diff changeset
    46
import collections
64ecd4d96ac7 [workflow] Utilities for declarative definition of workflows
Christophe de Vienne <christophe@unlish.com>
parents:
diff changeset
    47
64ecd4d96ac7 [workflow] Utilities for declarative definition of workflows
Christophe de Vienne <christophe@unlish.com>
parents:
diff changeset
    48
from six import text_type
64ecd4d96ac7 [workflow] Utilities for declarative definition of workflows
Christophe de Vienne <christophe@unlish.com>
parents:
diff changeset
    49
64ecd4d96ac7 [workflow] Utilities for declarative definition of workflows
Christophe de Vienne <christophe@unlish.com>
parents:
diff changeset
    50
from cubicweb import NoResultError
64ecd4d96ac7 [workflow] Utilities for declarative definition of workflows
Christophe de Vienne <christophe@unlish.com>
parents:
diff changeset
    51
64ecd4d96ac7 [workflow] Utilities for declarative definition of workflows
Christophe de Vienne <christophe@unlish.com>
parents:
diff changeset
    52
64ecd4d96ac7 [workflow] Utilities for declarative definition of workflows
Christophe de Vienne <christophe@unlish.com>
parents:
diff changeset
    53
def get_tuple_or_list(value):
64ecd4d96ac7 [workflow] Utilities for declarative definition of workflows
Christophe de Vienne <christophe@unlish.com>
parents:
diff changeset
    54
    if value is None:
64ecd4d96ac7 [workflow] Utilities for declarative definition of workflows
Christophe de Vienne <christophe@unlish.com>
parents:
diff changeset
    55
        return None
64ecd4d96ac7 [workflow] Utilities for declarative definition of workflows
Christophe de Vienne <christophe@unlish.com>
parents:
diff changeset
    56
    if not isinstance(value, (tuple, list)):
64ecd4d96ac7 [workflow] Utilities for declarative definition of workflows
Christophe de Vienne <christophe@unlish.com>
parents:
diff changeset
    57
        value = (value,)
64ecd4d96ac7 [workflow] Utilities for declarative definition of workflows
Christophe de Vienne <christophe@unlish.com>
parents:
diff changeset
    58
    return value
64ecd4d96ac7 [workflow] Utilities for declarative definition of workflows
Christophe de Vienne <christophe@unlish.com>
parents:
diff changeset
    59
64ecd4d96ac7 [workflow] Utilities for declarative definition of workflows
Christophe de Vienne <christophe@unlish.com>
parents:
diff changeset
    60
64ecd4d96ac7 [workflow] Utilities for declarative definition of workflows
Christophe de Vienne <christophe@unlish.com>
parents:
diff changeset
    61
def cleanupworkflow(cnx, wf, wfdef):
64ecd4d96ac7 [workflow] Utilities for declarative definition of workflows
Christophe de Vienne <christophe@unlish.com>
parents:
diff changeset
    62
    """Cleanup an existing workflow by removing the states and transitions that
64ecd4d96ac7 [workflow] Utilities for declarative definition of workflows
Christophe de Vienne <christophe@unlish.com>
parents:
diff changeset
    63
    do not exist in the given definition.
64ecd4d96ac7 [workflow] Utilities for declarative definition of workflows
Christophe de Vienne <christophe@unlish.com>
parents:
diff changeset
    64
64ecd4d96ac7 [workflow] Utilities for declarative definition of workflows
Christophe de Vienne <christophe@unlish.com>
parents:
diff changeset
    65
    :param cnx: A connexion with enough permissions to define a workflow
64ecd4d96ac7 [workflow] Utilities for declarative definition of workflows
Christophe de Vienne <christophe@unlish.com>
parents:
diff changeset
    66
    :param wf: A `Workflow` entity
64ecd4d96ac7 [workflow] Utilities for declarative definition of workflows
Christophe de Vienne <christophe@unlish.com>
parents:
diff changeset
    67
    :param wfdef: A workflow definition
64ecd4d96ac7 [workflow] Utilities for declarative definition of workflows
Christophe de Vienne <christophe@unlish.com>
parents:
diff changeset
    68
    """
64ecd4d96ac7 [workflow] Utilities for declarative definition of workflows
Christophe de Vienne <christophe@unlish.com>
parents:
diff changeset
    69
    cnx.execute(
64ecd4d96ac7 [workflow] Utilities for declarative definition of workflows
Christophe de Vienne <christophe@unlish.com>
parents:
diff changeset
    70
        'DELETE State S WHERE S state_of WF, WF eid %%(wf)s, '
64ecd4d96ac7 [workflow] Utilities for declarative definition of workflows
Christophe de Vienne <christophe@unlish.com>
parents:
diff changeset
    71
        'NOT S name IN (%s)' % (
64ecd4d96ac7 [workflow] Utilities for declarative definition of workflows
Christophe de Vienne <christophe@unlish.com>
parents:
diff changeset
    72
            ', '.join('"%s"' % s for s in wfdef['states'])),
64ecd4d96ac7 [workflow] Utilities for declarative definition of workflows
Christophe de Vienne <christophe@unlish.com>
parents:
diff changeset
    73
        {'wf': wf.eid})
64ecd4d96ac7 [workflow] Utilities for declarative definition of workflows
Christophe de Vienne <christophe@unlish.com>
parents:
diff changeset
    74
64ecd4d96ac7 [workflow] Utilities for declarative definition of workflows
Christophe de Vienne <christophe@unlish.com>
parents:
diff changeset
    75
    cnx.execute(
64ecd4d96ac7 [workflow] Utilities for declarative definition of workflows
Christophe de Vienne <christophe@unlish.com>
parents:
diff changeset
    76
        'DELETE Transition T WHERE T transition_of WF, WF eid %%(wf)s, '
64ecd4d96ac7 [workflow] Utilities for declarative definition of workflows
Christophe de Vienne <christophe@unlish.com>
parents:
diff changeset
    77
        'NOT T name IN (%s)' % (
64ecd4d96ac7 [workflow] Utilities for declarative definition of workflows
Christophe de Vienne <christophe@unlish.com>
parents:
diff changeset
    78
            ', '.join('"%s"' % s for s in wfdef['transitions'])),
64ecd4d96ac7 [workflow] Utilities for declarative definition of workflows
Christophe de Vienne <christophe@unlish.com>
parents:
diff changeset
    79
        {'wf': wf.eid})
64ecd4d96ac7 [workflow] Utilities for declarative definition of workflows
Christophe de Vienne <christophe@unlish.com>
parents:
diff changeset
    80
64ecd4d96ac7 [workflow] Utilities for declarative definition of workflows
Christophe de Vienne <christophe@unlish.com>
parents:
diff changeset
    81
64ecd4d96ac7 [workflow] Utilities for declarative definition of workflows
Christophe de Vienne <christophe@unlish.com>
parents:
diff changeset
    82
def setup_workflow(cnx, name, wfdef, cleanup=True):
64ecd4d96ac7 [workflow] Utilities for declarative definition of workflows
Christophe de Vienne <christophe@unlish.com>
parents:
diff changeset
    83
    """Create or update a workflow definition so it matches the given
64ecd4d96ac7 [workflow] Utilities for declarative definition of workflows
Christophe de Vienne <christophe@unlish.com>
parents:
diff changeset
    84
    definition.
64ecd4d96ac7 [workflow] Utilities for declarative definition of workflows
Christophe de Vienne <christophe@unlish.com>
parents:
diff changeset
    85
64ecd4d96ac7 [workflow] Utilities for declarative definition of workflows
Christophe de Vienne <christophe@unlish.com>
parents:
diff changeset
    86
    :param cnx: A connexion with enough permissions to define a workflow
64ecd4d96ac7 [workflow] Utilities for declarative definition of workflows
Christophe de Vienne <christophe@unlish.com>
parents:
diff changeset
    87
    :param name: The workflow name. Used to create the `Workflow` entity, or
64ecd4d96ac7 [workflow] Utilities for declarative definition of workflows
Christophe de Vienne <christophe@unlish.com>
parents:
diff changeset
    88
                 to find an existing one.
64ecd4d96ac7 [workflow] Utilities for declarative definition of workflows
Christophe de Vienne <christophe@unlish.com>
parents:
diff changeset
    89
    :param wfdef: A workflow definition.
64ecd4d96ac7 [workflow] Utilities for declarative definition of workflows
Christophe de Vienne <christophe@unlish.com>
parents:
diff changeset
    90
    :param cleanup: Remove extra states and transitions. Can be done separatly
64ecd4d96ac7 [workflow] Utilities for declarative definition of workflows
Christophe de Vienne <christophe@unlish.com>
parents:
diff changeset
    91
                    by calling :func:`cleanupworkflow`.
64ecd4d96ac7 [workflow] Utilities for declarative definition of workflows
Christophe de Vienne <christophe@unlish.com>
parents:
diff changeset
    92
    :return: The created/updated workflow entity
64ecd4d96ac7 [workflow] Utilities for declarative definition of workflows
Christophe de Vienne <christophe@unlish.com>
parents:
diff changeset
    93
    """
64ecd4d96ac7 [workflow] Utilities for declarative definition of workflows
Christophe de Vienne <christophe@unlish.com>
parents:
diff changeset
    94
    name = text_type(name)
64ecd4d96ac7 [workflow] Utilities for declarative definition of workflows
Christophe de Vienne <christophe@unlish.com>
parents:
diff changeset
    95
    try:
64ecd4d96ac7 [workflow] Utilities for declarative definition of workflows
Christophe de Vienne <christophe@unlish.com>
parents:
diff changeset
    96
        wf = cnx.find('Workflow', name=name).one()
64ecd4d96ac7 [workflow] Utilities for declarative definition of workflows
Christophe de Vienne <christophe@unlish.com>
parents:
diff changeset
    97
    except NoResultError:
64ecd4d96ac7 [workflow] Utilities for declarative definition of workflows
Christophe de Vienne <christophe@unlish.com>
parents:
diff changeset
    98
        wf = cnx.create_entity('Workflow', name=name)
64ecd4d96ac7 [workflow] Utilities for declarative definition of workflows
Christophe de Vienne <christophe@unlish.com>
parents:
diff changeset
    99
64ecd4d96ac7 [workflow] Utilities for declarative definition of workflows
Christophe de Vienne <christophe@unlish.com>
parents:
diff changeset
   100
    etypes = get_tuple_or_list(wfdef['etypes'])
64ecd4d96ac7 [workflow] Utilities for declarative definition of workflows
Christophe de Vienne <christophe@unlish.com>
parents:
diff changeset
   101
    cnx.execute('DELETE WF workflow_of ETYPE WHERE WF eid %%(wf)s, '
64ecd4d96ac7 [workflow] Utilities for declarative definition of workflows
Christophe de Vienne <christophe@unlish.com>
parents:
diff changeset
   102
                'NOT ETYPE name IN (%s)' % ','.join('"%s"' for e in etypes),
64ecd4d96ac7 [workflow] Utilities for declarative definition of workflows
Christophe de Vienne <christophe@unlish.com>
parents:
diff changeset
   103
                {'wf': wf.eid})
64ecd4d96ac7 [workflow] Utilities for declarative definition of workflows
Christophe de Vienne <christophe@unlish.com>
parents:
diff changeset
   104
    cnx.execute('SET WF workflow_of ETYPE WHERE'
64ecd4d96ac7 [workflow] Utilities for declarative definition of workflows
Christophe de Vienne <christophe@unlish.com>
parents:
diff changeset
   105
                ' NOT WF workflow_of ETYPE, WF eid %%(wf)s, ETYPE name IN (%s)'
64ecd4d96ac7 [workflow] Utilities for declarative definition of workflows
Christophe de Vienne <christophe@unlish.com>
parents:
diff changeset
   106
                % ','.join('"%s"' % e for e in etypes),
64ecd4d96ac7 [workflow] Utilities for declarative definition of workflows
Christophe de Vienne <christophe@unlish.com>
parents:
diff changeset
   107
                {'wf': wf.eid})
64ecd4d96ac7 [workflow] Utilities for declarative definition of workflows
Christophe de Vienne <christophe@unlish.com>
parents:
diff changeset
   108
    if wfdef['default']:
64ecd4d96ac7 [workflow] Utilities for declarative definition of workflows
Christophe de Vienne <christophe@unlish.com>
parents:
diff changeset
   109
        cnx.execute(
64ecd4d96ac7 [workflow] Utilities for declarative definition of workflows
Christophe de Vienne <christophe@unlish.com>
parents:
diff changeset
   110
            'SET ETYPE default_workflow X '
64ecd4d96ac7 [workflow] Utilities for declarative definition of workflows
Christophe de Vienne <christophe@unlish.com>
parents:
diff changeset
   111
            'WHERE '
64ecd4d96ac7 [workflow] Utilities for declarative definition of workflows
Christophe de Vienne <christophe@unlish.com>
parents:
diff changeset
   112
            'NOT ETYPE default_workflow X, '
64ecd4d96ac7 [workflow] Utilities for declarative definition of workflows
Christophe de Vienne <christophe@unlish.com>
parents:
diff changeset
   113
            'X eid %%(x)s, ETYPE name IN (%s)' % ','.join(
64ecd4d96ac7 [workflow] Utilities for declarative definition of workflows
Christophe de Vienne <christophe@unlish.com>
parents:
diff changeset
   114
                '"%s"' % e for e in etypes),
64ecd4d96ac7 [workflow] Utilities for declarative definition of workflows
Christophe de Vienne <christophe@unlish.com>
parents:
diff changeset
   115
            {'x': wf.eid})
64ecd4d96ac7 [workflow] Utilities for declarative definition of workflows
Christophe de Vienne <christophe@unlish.com>
parents:
diff changeset
   116
64ecd4d96ac7 [workflow] Utilities for declarative definition of workflows
Christophe de Vienne <christophe@unlish.com>
parents:
diff changeset
   117
    states = {}
64ecd4d96ac7 [workflow] Utilities for declarative definition of workflows
Christophe de Vienne <christophe@unlish.com>
parents:
diff changeset
   118
    states_transitions = collections.defaultdict(list)
64ecd4d96ac7 [workflow] Utilities for declarative definition of workflows
Christophe de Vienne <christophe@unlish.com>
parents:
diff changeset
   119
    for state in wfdef['states']:
64ecd4d96ac7 [workflow] Utilities for declarative definition of workflows
Christophe de Vienne <christophe@unlish.com>
parents:
diff changeset
   120
        st = wf.state_by_name(state) or wf.add_state(state)
64ecd4d96ac7 [workflow] Utilities for declarative definition of workflows
Christophe de Vienne <christophe@unlish.com>
parents:
diff changeset
   121
        states[state] = st
64ecd4d96ac7 [workflow] Utilities for declarative definition of workflows
Christophe de Vienne <christophe@unlish.com>
parents:
diff changeset
   122
64ecd4d96ac7 [workflow] Utilities for declarative definition of workflows
Christophe de Vienne <christophe@unlish.com>
parents:
diff changeset
   123
    if 'initial_state' in wfdef:
64ecd4d96ac7 [workflow] Utilities for declarative definition of workflows
Christophe de Vienne <christophe@unlish.com>
parents:
diff changeset
   124
        wf.cw_set(initial_state=states[wfdef['initial_state']])
64ecd4d96ac7 [workflow] Utilities for declarative definition of workflows
Christophe de Vienne <christophe@unlish.com>
parents:
diff changeset
   125
64ecd4d96ac7 [workflow] Utilities for declarative definition of workflows
Christophe de Vienne <christophe@unlish.com>
parents:
diff changeset
   126
    for trname, trdef in wfdef['transitions'].items():
12355
c703dc95c82e Fix flake8 issues since release 3.6.0
Philippe Pepiot <philippe.pepiot@logilab.fr>
parents: 11963
diff changeset
   127
        tr = (wf.transition_by_name(trname)
c703dc95c82e Fix flake8 issues since release 3.6.0
Philippe Pepiot <philippe.pepiot@logilab.fr>
parents: 11963
diff changeset
   128
              or cnx.create_entity('Transition', name=trname))
11963
64ecd4d96ac7 [workflow] Utilities for declarative definition of workflows
Christophe de Vienne <christophe@unlish.com>
parents:
diff changeset
   129
        tr.cw_set(transition_of=wf)
64ecd4d96ac7 [workflow] Utilities for declarative definition of workflows
Christophe de Vienne <christophe@unlish.com>
parents:
diff changeset
   130
        if trdef.get('tostate'):
64ecd4d96ac7 [workflow] Utilities for declarative definition of workflows
Christophe de Vienne <christophe@unlish.com>
parents:
diff changeset
   131
            tr.cw_set(destination_state=states[trdef['tostate']])
64ecd4d96ac7 [workflow] Utilities for declarative definition of workflows
Christophe de Vienne <christophe@unlish.com>
parents:
diff changeset
   132
        fromstates = get_tuple_or_list(trdef.get('fromstates', ()))
64ecd4d96ac7 [workflow] Utilities for declarative definition of workflows
Christophe de Vienne <christophe@unlish.com>
parents:
diff changeset
   133
        for stname in fromstates:
64ecd4d96ac7 [workflow] Utilities for declarative definition of workflows
Christophe de Vienne <christophe@unlish.com>
parents:
diff changeset
   134
            states_transitions[stname].append(tr)
64ecd4d96ac7 [workflow] Utilities for declarative definition of workflows
Christophe de Vienne <christophe@unlish.com>
parents:
diff changeset
   135
64ecd4d96ac7 [workflow] Utilities for declarative definition of workflows
Christophe de Vienne <christophe@unlish.com>
parents:
diff changeset
   136
        requiredgroups = get_tuple_or_list(trdef.get('requiredgroups', ()))
64ecd4d96ac7 [workflow] Utilities for declarative definition of workflows
Christophe de Vienne <christophe@unlish.com>
parents:
diff changeset
   137
        conditions = get_tuple_or_list(trdef.get('conditions', ()))
64ecd4d96ac7 [workflow] Utilities for declarative definition of workflows
Christophe de Vienne <christophe@unlish.com>
parents:
diff changeset
   138
64ecd4d96ac7 [workflow] Utilities for declarative definition of workflows
Christophe de Vienne <christophe@unlish.com>
parents:
diff changeset
   139
        tr.set_permissions(requiredgroups, conditions, reset=True)
64ecd4d96ac7 [workflow] Utilities for declarative definition of workflows
Christophe de Vienne <christophe@unlish.com>
parents:
diff changeset
   140
64ecd4d96ac7 [workflow] Utilities for declarative definition of workflows
Christophe de Vienne <christophe@unlish.com>
parents:
diff changeset
   141
    for stname, transitions in states_transitions.items():
64ecd4d96ac7 [workflow] Utilities for declarative definition of workflows
Christophe de Vienne <christophe@unlish.com>
parents:
diff changeset
   142
        state = states[stname]
64ecd4d96ac7 [workflow] Utilities for declarative definition of workflows
Christophe de Vienne <christophe@unlish.com>
parents:
diff changeset
   143
        state.cw_set(allowed_transition=None)
64ecd4d96ac7 [workflow] Utilities for declarative definition of workflows
Christophe de Vienne <christophe@unlish.com>
parents:
diff changeset
   144
        state.cw_set(allowed_transition=transitions)
64ecd4d96ac7 [workflow] Utilities for declarative definition of workflows
Christophe de Vienne <christophe@unlish.com>
parents:
diff changeset
   145
64ecd4d96ac7 [workflow] Utilities for declarative definition of workflows
Christophe de Vienne <christophe@unlish.com>
parents:
diff changeset
   146
    if cleanup:
64ecd4d96ac7 [workflow] Utilities for declarative definition of workflows
Christophe de Vienne <christophe@unlish.com>
parents:
diff changeset
   147
        cleanupworkflow(cnx, wf, wfdef)
64ecd4d96ac7 [workflow] Utilities for declarative definition of workflows
Christophe de Vienne <christophe@unlish.com>
parents:
diff changeset
   148
64ecd4d96ac7 [workflow] Utilities for declarative definition of workflows
Christophe de Vienne <christophe@unlish.com>
parents:
diff changeset
   149
    return wf