Projet

Général

Profil

0001-unfeed-clean-live-substitutions-vars-before-executin.patch

Nicolas Roche, 26 avril 2019 17:32

Télécharger (8,21 ko)

Voir les différences:

Subject: [PATCH] unfeed: clean live substitutions vars before executing
 workflow (#32558)

 tests/test_form_pages.py | 161 +++++++++++++++++++++++++++++++++++++++
 wcs/forms/root.py        |   3 +
 2 files changed, 164 insertions(+)
tests/test_form_pages.py
6158 6158
    params = resp.form.submit_fields()
6159 6159
    params = [(key, value if key != 'page_id' else 'eiuiu') for key, value in params]
6160 6160
    app.post('/foo/live', params=params)
6161

  
6162
def test_unfeed_structured_list_when_condition_changes(pub):
6163
    """
6164
    simulate selection of a structured list via condition on from,
6165
    followed by an evaluation on workflow in order to get structured value
6166
    from the selected list.
6167
    ie: test unfeed on ConditionVars
6168
    """
6169
    Workflow.wipe()
6170
    workflow = Workflow(name='test')
6171
    workflow.backoffice_fields_formdef = WorkflowBackofficeFieldsFormDef(workflow)
6172
    workflow.backoffice_fields_formdef.fields = [
6173
        fields.StringField(
6174
            id='bo1', label='first text', type='string', varname='both_text'),
6175
        fields.StringField(
6176
            id='bo2', label='first more', type='string', varname='both_more')
6177
    ]
6178

  
6179
    st1 = workflow.add_status('Status1', 'st1')
6180
    setbo = SetBackofficeFieldsWorkflowStatusItem()
6181
    setbo.parent = st1
6182
    setbo.fields = [
6183
        {'field_id': 'bo1',
6184
         'value': '{{ form_var_listA }} vs {{ form_var_listB }}'},
6185
        {'field_id': 'bo2',
6186
         'value': '{{ form_var_listA_more }} vs {{ form_var_listB_more }}'}
6187
         ]
6188
    st1.items.append(setbo)
6189
    workflow.store()
6190

  
6191
    items_A = [{'id': '1', 'text': 'A1', 'more':'moreA1'}]
6192
    items_B = [{'id': '1', 'text': 'B1', 'more':'moreB1'},
6193
               {'id': '2', 'text': 'B2', 'more':'moreB2'}]
6194
    formdef = create_formdef()
6195
    formdef.fields = [
6196
        fields.ItemField(id='1', varname='choice', items=['A', 'B'],
6197
                         type='item', label='list to choice'),
6198
        fields.ItemField(id='2', varname='listA', type='item', label='list A',
6199
                         data_source={'type': 'formula', 'value': str(items_A)},
6200
                         condition={'type': 'python',
6201
                                    'value': 'form_var_choice_raw == "A"'}),
6202
        fields.ItemField(id='3', varname='listB', type='item', label='list B',
6203
                         data_source={'type': 'formula', 'value': str(items_B)},
6204
                         condition={'type': 'python',
6205
                                    'value': 'form_var_choice_raw == "B"'})
6206
        ]
6207
    formdef.confirmation = False
6208
    formdef.workflow_id = workflow.id
6209
    formdef.store()
6210
    formdef.data_class().wipe()
6211

  
6212
    create_user_and_admin(pub)
6213
    resp = get_app(pub).get('/test/')
6214

  
6215
    resp.form['f1'].value = 'B'
6216
    resp.form['f2'].value = '1'
6217
    resp.form['f3'].value = '2'
6218

  
6219
    resp = resp.form.submit('submit').follow()
6220
    assert 'The form has been recorded' in resp.body
6221

  
6222
    assert formdef.data_class().count() == 1
6223
    formdata = formdef.data_class().select()[0]
6224
    assert formdata.data['1'] == 'B'
6225
    assert formdata.data.get('2') is None
6226
    assert formdata.data['3'] == '2'
6227

  
6228
    assert formdata.data['bo1'] == 'None vs B2'
6229
    assert formdata.data['bo2'] == ' vs moreB2'
6230

  
6231
def test_form_edit_and_backoffice_field_condition_change(pub):
6232
    """
6233
    test unfeed on ConditionVars within edit context
6234
    """
6235
    Workflow.wipe()
6236
    workflow = Workflow(name='test')
6237
    workflow.backoffice_fields_formdef = WorkflowBackofficeFieldsFormDef(workflow)
6238
    workflow.backoffice_fields_formdef.fields = [
6239
        fields.StringField(
6240
            id='bo1', label='both text', type='string', varname='both_text'),
6241
        fields.StringField(
6242
            id='bo2', label='both more', type='string', varname='both_more')
6243
    ]
6244

  
6245
    st1 = workflow.add_status('Status1', 'st1')
6246
    setbo = SetBackofficeFieldsWorkflowStatusItem()
6247
    setbo.parent = st1
6248
    setbo.fields = [
6249
        {'field_id': 'bo1',
6250
         'value': '{{ form_var_listA }} vs {{ form_var_listB }}'},
6251
        {'field_id': 'bo2',
6252
         'value': '{{ form_var_listA_more }} vs {{ form_var_listB_more }}'}
6253
         ]
6254
    editable = EditableWorkflowStatusItem()
6255
    editable.id = '_editable'
6256
    editable.by = ['_submitter']
6257
    editable.parent = st1
6258
    editable.status = st1.id
6259
    st1.items = [setbo, editable]
6260
    workflow.store()
6261

  
6262
    items_A = [{'id': '1', 'text': 'A1', 'more':'moreA1'}]
6263
    items_B = [{'id': '1', 'text': 'B1', 'more':'moreB1'},
6264
               {'id': '2', 'text': 'B2', 'more':'moreB2'}]
6265
    formdef = create_formdef()
6266
    formdef.fields = [
6267
        fields.ItemField(id='1', varname='choice', items=['A', 'B'],
6268
                         type='item', label='list to choice'),
6269
        fields.ItemField(id='2', varname='listA', type='item', label='list A',
6270
                         data_source={'type': 'formula', 'value': str(items_A)},
6271
                         condition={'type': 'python',
6272
                                    'value': 'form_var_choice_raw == "A"'}),
6273
        fields.ItemField(id='3', varname='listB', type='item', label='list B',
6274
                         data_source={'type': 'formula', 'value': str(items_B)},
6275
                         condition={'type': 'python',
6276
                                    'value': 'form_var_choice_raw == "B"'})
6277
        ]
6278
    formdef.confirmation = False
6279
    formdef.workflow_id = workflow.id
6280
    formdef.store()
6281
    formdef.data_class().wipe()
6282

  
6283
    create_user(pub)
6284
    resp = login(get_app(pub), username='foo', password='foo').get('/test/')
6285

  
6286
    resp.form['f1'].value = 'B'
6287
    resp.form['f2'].value = '1'
6288
    resp.form['f3'].value = '2'
6289

  
6290
    resp = resp.form.submit('submit').follow()
6291
    assert 'The form has been recorded' in resp.body
6292

  
6293
    assert formdef.data_class().count() == 1
6294
    formdata = formdef.data_class().select()[0]
6295
    assert formdata.data['1'] == 'B'
6296
    assert formdata.data.get('2') is None
6297
    assert formdata.data['3'] == '2'
6298

  
6299
    # check unfeed on FormPage::submitted()
6300
    assert formdata.data['bo1'] == 'None vs B2'
6301
    assert formdata.data['bo2'] == ' vs moreB2'
6302

  
6303
    app = login(get_app(pub), username='foo', password='foo')
6304
    resp = app.get('/test/%s/' % formdata.id)
6305
    assert 'button_editable-button' in resp.body
6306

  
6307
    resp = resp.form.submit('button_editable').follow()
6308
    assert resp.form['f1'].value == 'B'
6309
    resp.form['f1'].value = 'A'
6310
    resp = resp.form.submit('submit').follow()  # -> saved
6311
    assert 'The form has been recorded' in resp.body
6312

  
6313
    assert formdef.data_class().count() == 1
6314
    formdata = formdef.data_class().select()[0]
6315
    assert formdata.data['1'] == 'A'
6316
    assert formdata.data['2'] == '1'
6317
    assert formdata.data.get('3') is None
6318

  
6319
    # check unfeed on FormPage::submitted_existing()
6320
    assert formdata.data['bo1'] == 'A1 vs None'
6321
    assert formdata.data['bo2'] == 'moreA1 vs '
wcs/forms/root.py
1148 1148
        get_logger().info('form %s - done (id: %s)' % (self.formdef.name, filled.id))
1149 1149
        url = None
1150 1150
        if existing_formdata is None:
1151
            get_publisher().substitutions.unfeed(lambda x: x.__class__.__name__ == 'ConditionVars')
1152
            get_publisher().substitutions.unfeed(lambda x: isinstance(x, FormData))
1151 1153
            url = filled.perform_workflow()
1152 1154

  
1153 1155
        if not filled.user_id:
......
1181 1183
        self.edited_data.data = new_data
1182 1184
        self.edited_data.store()
1183 1185
        # remove previous formdata from substitution variables
1186
        get_publisher().substitutions.unfeed(lambda x: x.__class__.__name__ == 'ConditionVars')
1184 1187
        get_publisher().substitutions.unfeed(lambda x: isinstance(x, FormData))
1185 1188
        # and add new one
1186 1189
        get_publisher().substitutions.feed(self.edited_data)
1187
-