Projet

Général

Profil

0003-workflows-add-possibility-to-dispatch-function-accor.patch

Frédéric Péters, 04 janvier 2016 16:15

Télécharger (9,1 ko)

Voir les différences:

Subject: [PATCH 3/3] workflows: add possibility to dispatch function according
 to a variable (#9091)

 tests/test_admin_pages.py |  33 +++++++++++++++
 tests/test_workflows.py   |  41 ++++++++++++++++++
 wcs/wf/dispatch.py        | 104 ++++++++++++++++++++++++++++++++++++++++++----
 3 files changed, 171 insertions(+), 7 deletions(-)
tests/test_admin_pages.py
1329 1329
        resp = resp.follow() # redirect to items/
1330 1330
        resp = resp.follow() # redirect to ./
1331 1331

  
1332
def test_workflows_edit_dispatch_action(pub):
1333
    create_superuser(pub)
1334
    role = create_role()
1335
    Workflow.wipe()
1336
    workflow = Workflow(name='foo')
1337
    workflow.add_status(name='baz')
1338
    workflow.store()
1339

  
1340
    app = login(get_app(pub))
1341
    resp = app.get('/backoffice/workflows/1/')
1342
    resp = resp.click('baz')
1343

  
1344
    resp.forms[0]['type'] = 'Assign a Function'
1345
    resp = resp.forms[0].submit()
1346
    resp = resp.follow()
1347

  
1348
    resp = resp.click('Assign a Function')
1349
    resp.form['rules$element0$value'].value = 'FOOBAR'
1350
    resp.form['rules$element0$role_id'].value = str(role.id)
1351
    resp = resp.form.submit('submit')
1352
    resp = resp.follow()
1353
    resp = resp.follow()
1354

  
1355
    resp = resp.click('Assign a Function')
1356
    assert resp.form['rules$element0$value'].value == 'FOOBAR'
1357
    resp.form['rules$element1$value'].value = 'BARFOO'
1358
    resp.form['rules$element1$role_id'].value = str(role.id)
1359
    resp = resp.form.submit('submit')
1360

  
1361
    workflow = Workflow.get(workflow.id)
1362
    assert workflow.possible_status[0].items[0].rules == [
1363
            {'value': 'FOOBAR', 'role_id': '1'}, {'value': 'BARFOO', 'role_id': '1'}]
1364

  
1332 1365
def test_workflows_variables(pub):
1333 1366
    create_superuser(pub)
1334 1367
    create_role()
tests/test_workflows.py
170 170
    item.perform(formdata)
171 171
    assert formdata.workflow_roles == {'_receiver': '1'}
172 172

  
173
def test_dispatch_auto(pub):
174
    formdef = FormDef()
175
    formdef.name = 'baz'
176
    formdef.fields = [
177
        StringField(id='1', label='Test', type='string', varname='foo'),
178
    ]
179
    formdef.store()
180

  
181
    item = DispatchWorkflowStatusItem()
182
    item.role_key = '_receiver'
183
    item.dispatch_type = 'automatic'
184

  
185
    formdata = formdef.data_class()()
186
    pub.substitutions.feed(formdata)
187
    item.perform(formdata)
188
    assert not formdata.workflow_roles
189

  
190
    item.variable = 'form_var_foo'
191
    item.rules = [
192
        {'role_id': '1', 'value': 'foo'},
193
        {'role_id': '2', 'value': 'bar'},
194
    ]
195

  
196
    item.perform(formdata)
197
    assert not formdata.workflow_roles
198

  
199
    # no match
200
    formdata.data = {'1': 'XXX'}
201
    item.perform(formdata)
202
    assert not formdata.workflow_roles
203

  
204
    # match
205
    formdata.data = {'1': 'foo'}
206
    item.perform(formdata)
207
    assert formdata.workflow_roles == {'_receiver': '1'}
208

  
209
    # other match
210
    formdata.data = {'1': 'bar'}
211
    item.perform(formdata)
212
    assert formdata.workflow_roles == {'_receiver': '2'}
213

  
173 214
def test_roles(pub):
174 215
    user = pub.user_class()
175 216
    user.store()
wcs/wf/dispatch.py
14 14
# You should have received a copy of the GNU General Public License
15 15
# along with this program; if not, see <http://www.gnu.org/licenses/>.
16 16

  
17
import collections
18

  
17 19
from qommon.form import *
18 20
from wcs.roles import get_user_roles
19 21
from wcs.workflows import WorkflowStatusItem, register_item_class
20 22

  
23

  
24
class AutomaticDispatchRowWidget(CompositeWidget):
25
    def __init__(self, name, value=None, **kwargs):
26
        CompositeWidget.__init__(self, name, value, **kwargs)
27
        if not value:
28
            value = {}
29
        self.add(StringWidget, name='value', title=_('Value'),
30
                value=value.get('value'), **kwargs)
31
        self.add(SingleSelectWidget, name='role_id', title=_('Role'),
32
                value=value.get('role_id'),
33
                options=[(None, '----', None)] + get_user_roles())
34

  
35
    def _parse(self, request):
36
        if self.get('value') or self.get('role_id'):
37
            self.value = {
38
                'value': self.get('value'),
39
                'role_id': self.get('role_id')
40
            }
41
        else:
42
            self.value = None
43

  
44

  
45
class AutomaticDispatchTableWidget(WidgetListAsTable):
46
    readonly = False
47
    def __init__(self, name, **kwargs):
48
        super(AutomaticDispatchTableWidget, self).__init__(name,
49
                element_type=AutomaticDispatchRowWidget, **kwargs)
50

  
51

  
21 52
class DispatchWorkflowStatusItem(WorkflowStatusItem):
22 53
    description = N_('Assign a Function')
23 54
    key = 'dispatch'
24 55

  
25 56
    role_id = None
26 57
    role_key = None
58
    dispatch_type = 'manual'
59
    variable = None
60
    rules = None
27 61

  
28 62
    def get_parameters(self):
29
        return ('role_key', 'role_id')
63
        return ('role_key', 'role_id', 'dispatch_type', 'variable', 'rules')
30 64

  
31 65
    def role_id_export_to_xml(self, item, charset, include_id=False):
32 66
        self._role_export_to_xml('role_id', item, charset,
......
49 83
            form.add(SingleSelectWidget, '%srole_key' % prefix,
50 84
                     title=_('Function to Set'), value=self.role_key,
51 85
                     options=[(None, '----')] + self.parent.parent.roles.items())
86
        dispatch_types = collections.OrderedDict(
87
                [('manual', _('Manual')), ('automatic', _('Automatic'))])
88
        if 'dispatch_type' in parameters:
89
            form.add(RadiobuttonsWidget, '%sdispatch_type' % prefix,
90
                    title=_('Type'),
91
                    options=dispatch_types.items(),
92
                    value=self.dispatch_type,
93
                    required=True,
94
                    attrs={'data-dynamic-display-parent': 'true'})
52 95
        if 'role_id' in parameters:
53 96
            form.add(SingleSelectWidget, '%srole_id' % prefix,
54 97
                     title=_('Role'), value=str(self.role_id),
55
                     options=[(None, '----', None)] + get_user_roles())
98
                     options=[(None, '----', None)] + get_user_roles(),
99
                     attrs={
100
                         'data-dynamic-display-child-of': '%sdispatch_type' % prefix,
101
                         'data-dynamic-display-value': dispatch_types.get('manual'),
102
                         }
103
                     )
104
        if 'variable' in parameters:
105
            form.add(StringWidget, '%svariable' % prefix,
106
                    title=_('Variable'),
107
                    value=self.variable,
108
                    attrs={
109
                        'data-dynamic-display-child-of': '%sdispatch_type' % prefix,
110
                        'data-dynamic-display-value': dispatch_types.get('automatic'),
111
                        }
112
                    )
113
        if 'rules' in parameters:
114
            form.add(AutomaticDispatchTableWidget, '%srules' % prefix,
115
                    title=_('Rules'),
116
                    value=self.rules,
117
                    attrs={
118
                        'data-dynamic-display-child-of': '%sdispatch_type' % prefix,
119
                        'data-dynamic-display-value': dispatch_types.get('automatic'),
120
                        }
121
                    )
56 122

  
57 123
    def perform(self, formdata):
58
        if not (self.role_id and self.role_key):
59
            return
60 124
        if not formdata.workflow_roles:
61 125
            formdata.workflow_roles = {}
62
        formdata.workflow_roles[self.role_key] = str(self.role_id)
63
        formdata.store()
64 126

  
65
register_item_class(DispatchWorkflowStatusItem)
127
        new_role_id = None
128

  
129
        if self.dispatch_type == 'manual' or not self.dispatch_type:
130
            if not (self.role_id and self.role_key):
131
                return
132
            new_role_id = self.role_id
133
        elif self.dispatch_type == 'automatic':
134
            if not (self.role_key and self.variable and self.rules):
135
                return
136
            variables = get_publisher().substitutions.get_context_variables()
137
            # convert the given value to a few different types, to allow more
138
            # diversity in matching.
139
            variable_values = [variables.get(self.variable)]
140
            if not variable_values[0]:
141
                variable_values.append(None)
142
            try:
143
                variable_values.append(int(variable_values[0]))
144
            except (ValueError, TypeError):
145
                pass
66 146

  
147
            for rule in self.rules:
148
                if rule.get('value') in variable_values:
149
                    new_role_id = rule.get('role_id')
150
                    break
151

  
152
        if new_role_id:
153
            formdata.workflow_roles[self.role_key] = str(new_role_id)
154
            formdata.store()
155

  
156
register_item_class(DispatchWorkflowStatusItem)
67
-