cubicweb/wfutils.py
author Denis Laxalde <denis.laxalde@logilab.fr>
Fri, 05 Apr 2019 17:58:19 +0200
changeset 12567 26744ad37953
parent 12355 c703dc95c82e
permissions -rw-r--r--
Drop python2 support This mostly consists in removing the dependency on "six" and updating the code to use only Python3 idioms. Notice that we previously used TemporaryDirectory from cubicweb.devtools.testlib for compatibility with Python2. We now directly import it from tempfile.
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 cubicweb import NoResultError
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
64ecd4d96ac7 [workflow] Utilities for declarative definition of workflows
Christophe de Vienne <christophe@unlish.com>
parents:
diff changeset
    51
def get_tuple_or_list(value):
64ecd4d96ac7 [workflow] Utilities for declarative definition of workflows
Christophe de Vienne <christophe@unlish.com>
parents:
diff changeset
    52
    if value is None:
64ecd4d96ac7 [workflow] Utilities for declarative definition of workflows
Christophe de Vienne <christophe@unlish.com>
parents:
diff changeset
    53
        return None
64ecd4d96ac7 [workflow] Utilities for declarative definition of workflows
Christophe de Vienne <christophe@unlish.com>
parents:
diff changeset
    54
    if not isinstance(value, (tuple, list)):
64ecd4d96ac7 [workflow] Utilities for declarative definition of workflows
Christophe de Vienne <christophe@unlish.com>
parents:
diff changeset
    55
        value = (value,)
64ecd4d96ac7 [workflow] Utilities for declarative definition of workflows
Christophe de Vienne <christophe@unlish.com>
parents:
diff changeset
    56
    return value
64ecd4d96ac7 [workflow] Utilities for declarative definition of workflows
Christophe de Vienne <christophe@unlish.com>
parents:
diff changeset
    57
64ecd4d96ac7 [workflow] Utilities for declarative definition of workflows
Christophe de Vienne <christophe@unlish.com>
parents:
diff changeset
    58
64ecd4d96ac7 [workflow] Utilities for declarative definition of workflows
Christophe de Vienne <christophe@unlish.com>
parents:
diff changeset
    59
def cleanupworkflow(cnx, wf, wfdef):
64ecd4d96ac7 [workflow] Utilities for declarative definition of workflows
Christophe de Vienne <christophe@unlish.com>
parents:
diff changeset
    60
    """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
    61
    do not exist in the given definition.
64ecd4d96ac7 [workflow] Utilities for declarative definition of workflows
Christophe de Vienne <christophe@unlish.com>
parents:
diff changeset
    62
64ecd4d96ac7 [workflow] Utilities for declarative definition of workflows
Christophe de Vienne <christophe@unlish.com>
parents:
diff changeset
    63
    :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
    64
    :param wf: A `Workflow` entity
64ecd4d96ac7 [workflow] Utilities for declarative definition of workflows
Christophe de Vienne <christophe@unlish.com>
parents:
diff changeset
    65
    :param wfdef: A workflow definition
64ecd4d96ac7 [workflow] Utilities for declarative definition of workflows
Christophe de Vienne <christophe@unlish.com>
parents:
diff changeset
    66
    """
64ecd4d96ac7 [workflow] Utilities for declarative definition of workflows
Christophe de Vienne <christophe@unlish.com>
parents:
diff changeset
    67
    cnx.execute(
64ecd4d96ac7 [workflow] Utilities for declarative definition of workflows
Christophe de Vienne <christophe@unlish.com>
parents:
diff changeset
    68
        '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
    69
        'NOT S name IN (%s)' % (
64ecd4d96ac7 [workflow] Utilities for declarative definition of workflows
Christophe de Vienne <christophe@unlish.com>
parents:
diff changeset
    70
            ', '.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
    71
        {'wf': wf.eid})
64ecd4d96ac7 [workflow] Utilities for declarative definition of workflows
Christophe de Vienne <christophe@unlish.com>
parents:
diff changeset
    72
64ecd4d96ac7 [workflow] Utilities for declarative definition of workflows
Christophe de Vienne <christophe@unlish.com>
parents:
diff changeset
    73
    cnx.execute(
64ecd4d96ac7 [workflow] Utilities for declarative definition of workflows
Christophe de Vienne <christophe@unlish.com>
parents:
diff changeset
    74
        '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
    75
        'NOT T name IN (%s)' % (
64ecd4d96ac7 [workflow] Utilities for declarative definition of workflows
Christophe de Vienne <christophe@unlish.com>
parents:
diff changeset
    76
            ', '.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
    77
        {'wf': wf.eid})
64ecd4d96ac7 [workflow] Utilities for declarative definition of workflows
Christophe de Vienne <christophe@unlish.com>
parents:
diff changeset
    78
64ecd4d96ac7 [workflow] Utilities for declarative definition of workflows
Christophe de Vienne <christophe@unlish.com>
parents:
diff changeset
    79
64ecd4d96ac7 [workflow] Utilities for declarative definition of workflows
Christophe de Vienne <christophe@unlish.com>
parents:
diff changeset
    80
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
    81
    """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
    82
    definition.
64ecd4d96ac7 [workflow] Utilities for declarative definition of workflows
Christophe de Vienne <christophe@unlish.com>
parents:
diff changeset
    83
64ecd4d96ac7 [workflow] Utilities for declarative definition of workflows
Christophe de Vienne <christophe@unlish.com>
parents:
diff changeset
    84
    :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
    85
    :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
    86
                 to find an existing one.
64ecd4d96ac7 [workflow] Utilities for declarative definition of workflows
Christophe de Vienne <christophe@unlish.com>
parents:
diff changeset
    87
    :param wfdef: A workflow definition.
64ecd4d96ac7 [workflow] Utilities for declarative definition of workflows
Christophe de Vienne <christophe@unlish.com>
parents:
diff changeset
    88
    :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
    89
                    by calling :func:`cleanupworkflow`.
64ecd4d96ac7 [workflow] Utilities for declarative definition of workflows
Christophe de Vienne <christophe@unlish.com>
parents:
diff changeset
    90
    :return: The created/updated workflow entity
64ecd4d96ac7 [workflow] Utilities for declarative definition of workflows
Christophe de Vienne <christophe@unlish.com>
parents:
diff changeset
    91
    """
64ecd4d96ac7 [workflow] Utilities for declarative definition of workflows
Christophe de Vienne <christophe@unlish.com>
parents:
diff changeset
    92
    try:
64ecd4d96ac7 [workflow] Utilities for declarative definition of workflows
Christophe de Vienne <christophe@unlish.com>
parents:
diff changeset
    93
        wf = cnx.find('Workflow', name=name).one()
64ecd4d96ac7 [workflow] Utilities for declarative definition of workflows
Christophe de Vienne <christophe@unlish.com>
parents:
diff changeset
    94
    except NoResultError:
64ecd4d96ac7 [workflow] Utilities for declarative definition of workflows
Christophe de Vienne <christophe@unlish.com>
parents:
diff changeset
    95
        wf = cnx.create_entity('Workflow', name=name)
64ecd4d96ac7 [workflow] Utilities for declarative definition of workflows
Christophe de Vienne <christophe@unlish.com>
parents:
diff changeset
    96
64ecd4d96ac7 [workflow] Utilities for declarative definition of workflows
Christophe de Vienne <christophe@unlish.com>
parents:
diff changeset
    97
    etypes = get_tuple_or_list(wfdef['etypes'])
64ecd4d96ac7 [workflow] Utilities for declarative definition of workflows
Christophe de Vienne <christophe@unlish.com>
parents:
diff changeset
    98
    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
    99
                '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
   100
                {'wf': wf.eid})
64ecd4d96ac7 [workflow] Utilities for declarative definition of workflows
Christophe de Vienne <christophe@unlish.com>
parents:
diff changeset
   101
    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
   102
                ' 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
   103
                % ','.join('"%s"' % e for e in etypes),
64ecd4d96ac7 [workflow] Utilities for declarative definition of workflows
Christophe de Vienne <christophe@unlish.com>
parents:
diff changeset
   104
                {'wf': wf.eid})
64ecd4d96ac7 [workflow] Utilities for declarative definition of workflows
Christophe de Vienne <christophe@unlish.com>
parents:
diff changeset
   105
    if wfdef['default']:
64ecd4d96ac7 [workflow] Utilities for declarative definition of workflows
Christophe de Vienne <christophe@unlish.com>
parents:
diff changeset
   106
        cnx.execute(
64ecd4d96ac7 [workflow] Utilities for declarative definition of workflows
Christophe de Vienne <christophe@unlish.com>
parents:
diff changeset
   107
            'SET ETYPE default_workflow X '
64ecd4d96ac7 [workflow] Utilities for declarative definition of workflows
Christophe de Vienne <christophe@unlish.com>
parents:
diff changeset
   108
            'WHERE '
64ecd4d96ac7 [workflow] Utilities for declarative definition of workflows
Christophe de Vienne <christophe@unlish.com>
parents:
diff changeset
   109
            'NOT ETYPE default_workflow X, '
64ecd4d96ac7 [workflow] Utilities for declarative definition of workflows
Christophe de Vienne <christophe@unlish.com>
parents:
diff changeset
   110
            '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
   111
                '"%s"' % e for e in etypes),
64ecd4d96ac7 [workflow] Utilities for declarative definition of workflows
Christophe de Vienne <christophe@unlish.com>
parents:
diff changeset
   112
            {'x': wf.eid})
64ecd4d96ac7 [workflow] Utilities for declarative definition of workflows
Christophe de Vienne <christophe@unlish.com>
parents:
diff changeset
   113
64ecd4d96ac7 [workflow] Utilities for declarative definition of workflows
Christophe de Vienne <christophe@unlish.com>
parents:
diff changeset
   114
    states = {}
64ecd4d96ac7 [workflow] Utilities for declarative definition of workflows
Christophe de Vienne <christophe@unlish.com>
parents:
diff changeset
   115
    states_transitions = collections.defaultdict(list)
64ecd4d96ac7 [workflow] Utilities for declarative definition of workflows
Christophe de Vienne <christophe@unlish.com>
parents:
diff changeset
   116
    for state in wfdef['states']:
64ecd4d96ac7 [workflow] Utilities for declarative definition of workflows
Christophe de Vienne <christophe@unlish.com>
parents:
diff changeset
   117
        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
   118
        states[state] = st
64ecd4d96ac7 [workflow] Utilities for declarative definition of workflows
Christophe de Vienne <christophe@unlish.com>
parents:
diff changeset
   119
64ecd4d96ac7 [workflow] Utilities for declarative definition of workflows
Christophe de Vienne <christophe@unlish.com>
parents:
diff changeset
   120
    if 'initial_state' in wfdef:
64ecd4d96ac7 [workflow] Utilities for declarative definition of workflows
Christophe de Vienne <christophe@unlish.com>
parents:
diff changeset
   121
        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
   122
64ecd4d96ac7 [workflow] Utilities for declarative definition of workflows
Christophe de Vienne <christophe@unlish.com>
parents:
diff changeset
   123
    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
   124
        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
   125
              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
   126
        tr.cw_set(transition_of=wf)
64ecd4d96ac7 [workflow] Utilities for declarative definition of workflows
Christophe de Vienne <christophe@unlish.com>
parents:
diff changeset
   127
        if trdef.get('tostate'):
64ecd4d96ac7 [workflow] Utilities for declarative definition of workflows
Christophe de Vienne <christophe@unlish.com>
parents:
diff changeset
   128
            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
   129
        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
   130
        for stname in fromstates:
64ecd4d96ac7 [workflow] Utilities for declarative definition of workflows
Christophe de Vienne <christophe@unlish.com>
parents:
diff changeset
   131
            states_transitions[stname].append(tr)
64ecd4d96ac7 [workflow] Utilities for declarative definition of workflows
Christophe de Vienne <christophe@unlish.com>
parents:
diff changeset
   132
64ecd4d96ac7 [workflow] Utilities for declarative definition of workflows
Christophe de Vienne <christophe@unlish.com>
parents:
diff changeset
   133
        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
   134
        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
   135
64ecd4d96ac7 [workflow] Utilities for declarative definition of workflows
Christophe de Vienne <christophe@unlish.com>
parents:
diff changeset
   136
        tr.set_permissions(requiredgroups, conditions, reset=True)
64ecd4d96ac7 [workflow] Utilities for declarative definition of workflows
Christophe de Vienne <christophe@unlish.com>
parents:
diff changeset
   137
64ecd4d96ac7 [workflow] Utilities for declarative definition of workflows
Christophe de Vienne <christophe@unlish.com>
parents:
diff changeset
   138
    for stname, transitions in states_transitions.items():
64ecd4d96ac7 [workflow] Utilities for declarative definition of workflows
Christophe de Vienne <christophe@unlish.com>
parents:
diff changeset
   139
        state = states[stname]
64ecd4d96ac7 [workflow] Utilities for declarative definition of workflows
Christophe de Vienne <christophe@unlish.com>
parents:
diff changeset
   140
        state.cw_set(allowed_transition=None)
64ecd4d96ac7 [workflow] Utilities for declarative definition of workflows
Christophe de Vienne <christophe@unlish.com>
parents:
diff changeset
   141
        state.cw_set(allowed_transition=transitions)
64ecd4d96ac7 [workflow] Utilities for declarative definition of workflows
Christophe de Vienne <christophe@unlish.com>
parents:
diff changeset
   142
64ecd4d96ac7 [workflow] Utilities for declarative definition of workflows
Christophe de Vienne <christophe@unlish.com>
parents:
diff changeset
   143
    if cleanup:
64ecd4d96ac7 [workflow] Utilities for declarative definition of workflows
Christophe de Vienne <christophe@unlish.com>
parents:
diff changeset
   144
        cleanupworkflow(cnx, wf, wfdef)
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
    return wf