Projet

Général

Profil

0002-workflow-prefix-fields-in-FormWorkflowStatusItem-138.patch

Lauréline Guérin, 03 décembre 2020 11:08

Télécharger (25,1 ko)

Voir les différences:

Subject: [PATCH 2/2] workflow: prefix fields in FormWorkflowStatusItem
 (#13846)

 tests/backoffice_pages/test_all.py |  64 ++++++++---------
 tests/form_pages/test_all.py       | 106 ++++++++++++++---------------
 tests/form_pages/test_block.py     |   2 +-
 tests/form_pages/test_formdata.py  |  90 +++++++++++++++++++++---
 tests/test_workflows.py            |   4 +-
 wcs/fields.py                      |   1 -
 wcs/wf/form.py                     |  13 +++-
 7 files changed, 180 insertions(+), 100 deletions(-)
tests/backoffice_pages/test_all.py
3654 3654
            break
3655 3655
    app = login(get_app(pub))
3656 3656
    resp = app.get(formdata.get_url(backoffice=True))
3657
    assert 'f1' in resp.form.fields
3658
    resp.form['f1'] = 'blah'
3657
    assert 'fblah_1' in resp.form.fields
3658
    resp.form['fblah_1'] = 'blah'
3659 3659
    # don't fill required radio button
3660 3660
    resp = resp.form.submit('submit')
3661 3661
    assert formdef.data_class().get(formdata.id).status == 'wf-new'
3662 3662
    assert 'There were errors processing your form.' in resp.text
3663
    resp.form['f2'] = 'c'
3663
    resp.form['fblah_2'] = 'c'
3664 3664
    resp = resp.form.submit('submit')
3665 3665
    assert formdef.data_class().get(formdata.id).status == 'wf-accepted'
3666 3666
    assert formdef.data_class().get(formdata.id).workflow_data == {
......
3704 3704
            break
3705 3705
    app = login(get_app(pub))
3706 3706
    resp = app.get(formdata.get_url(backoffice=True))
3707
    assert 'f1' in resp.form.fields
3708
    assert 'f2' in resp.form.fields
3707
    assert 'fblah_1' in resp.form.fields
3708
    assert 'fblah_2' in resp.form.fields
3709 3709

  
3710 3710
    # check with static condition
3711 3711
    display_form.formdef.fields = [
......
3717 3717
    wf.store()
3718 3718

  
3719 3719
    resp = login(get_app(pub)).get(formdata.get_url(backoffice=True))
3720
    assert 'f1' in resp.form.fields
3721
    assert 'f2' not in resp.form.fields
3720
    assert 'fblah_1' in resp.form.fields
3721
    assert 'fblah_2' not in resp.form.fields
3722 3722

  
3723 3723
    # check condition based on formdata
3724 3724
    display_form.formdef.fields = [
......
3730 3730
    wf.store()
3731 3731

  
3732 3732
    resp = login(get_app(pub)).get(formdata.get_url(backoffice=True))
3733
    assert 'f1' in resp.form.fields
3734
    assert 'f2' in resp.form.fields
3733
    assert 'fblah_1' in resp.form.fields
3734
    assert 'fblah_2' in resp.form.fields
3735 3735

  
3736 3736
    display_form.formdef.fields = [
3737 3737
            fields.StringField(id='1', label='Test', varname='str', type='string', required=True),
......
3742 3742
    wf.store()
3743 3743

  
3744 3744
    resp = login(get_app(pub)).get(formdata.get_url(backoffice=True))
3745
    assert 'f1' in resp.form.fields
3746
    assert 'f2' in resp.form.fields
3745
    assert 'fblah_1' in resp.form.fields
3746
    assert 'fblah_2' in resp.form.fields
3747 3747

  
3748 3748
    # check with live conditions
3749 3749
    display_form.formdef.fields = [
......
3755 3755
    wf.store()
3756 3756

  
3757 3757
    resp = login(get_app(pub)).get(formdata.get_url(backoffice=True))
3758
    assert 'f1' in resp.form.fields
3759
    assert 'f2' in resp.form.fields
3760
    assert resp.html.find('div', {'data-field-id': '1'}).attrs['data-live-source'] == 'true'
3761
    assert resp.html.find('div', {'data-field-id': '2'}).attrs.get('style') == 'display: none'
3758
    assert 'fblah_1' in resp.form.fields
3759
    assert 'fblah_2' in resp.form.fields
3760
    assert resp.html.find('div', {'data-field-id': 'blah_1'}).attrs['data-live-source'] == 'true'
3761
    assert resp.html.find('div', {'data-field-id': 'blah_2'}).attrs.get('style') == 'display: none'
3762 3762
    live_url = resp.html.find('form').attrs['data-live-url']
3763 3763
    assert '/backoffice/' in live_url
3764
    resp.form['f1'] = ''
3764
    resp.form['fblah_1'] = ''
3765 3765
    live_resp = app.post(live_url, params=resp.form.submit_fields())
3766
    assert live_resp.json['result']['1']['visible']
3767
    assert not live_resp.json['result']['2']['visible']
3766
    assert live_resp.json['result']['blah_1']['visible']
3767
    assert not live_resp.json['result']['blah_2']['visible']
3768 3768

  
3769
    resp.form['f1'] = 'xxx'
3769
    resp.form['fblah_1'] = 'xxx'
3770 3770
    live_resp = app.post(live_url, params=resp.form.submit_fields())
3771
    assert live_resp.json['result']['1']['visible']
3772
    assert live_resp.json['result']['2']['visible']
3771
    assert live_resp.json['result']['blah_1']['visible']
3772
    assert live_resp.json['result']['blah_2']['visible']
3773 3773

  
3774 3774
    # check submit doesn't work
3775 3775
    resp = resp.form.submit('submit')
3776 3776
    assert 'There were errors processing your form.' in resp.text
3777 3777

  
3778
    resp.form['f1'] = 'xxx2'
3778
    resp.form['fblah_1'] = 'xxx2'
3779 3779
    live_resp = app.post(live_url, params=resp.form.submit_fields())
3780
    assert live_resp.json['result']['1']['visible']
3781
    assert not live_resp.json['result']['2']['visible']
3780
    assert live_resp.json['result']['blah_1']['visible']
3781
    assert not live_resp.json['result']['blah_2']['visible']
3782 3782

  
3783 3783
    # check submit does work when second field is hidden
3784 3784
    resp = resp.form.submit('submit').follow()
......
3832 3832
        urlopen.side_effect = side_effect
3833 3833

  
3834 3834
        resp = login(app).get(formdata.get_url(backoffice=True))
3835
        assert 'f1' in resp.form.fields
3836
        assert 'f2' in resp.form.fields
3837
        assert resp.form.fields['f2'][0].options == [(u'A', False, u'hello'), (u'B', False, u'world')]
3835
        assert 'fblah_1' in resp.form.fields
3836
        assert 'fblah_2' in resp.form.fields
3837
        assert resp.form.fields['fblah_2'][0].options == [(u'A', False, u'hello'), (u'B', False, u'world')]
3838 3838

  
3839 3839
        live_url = resp.html.find('form').attrs['data-live-url']
3840
        resp.form['f1'] = 'toto'
3841
        live_resp = app.post(live_url + '?modified_field_id=1', params=resp.form.submit_fields())
3842
        assert live_resp.json['result']['2']['items'] == [{u'text': u'hello', u'id': u'C'}, {u'text': u'world', u'id': u'D'}]
3840
        resp.form['fblah_1'] = 'toto'
3841
        live_resp = app.post(live_url + '?modified_field_id=blah_1', params=resp.form.submit_fields())
3842
        assert live_resp.json['result']['blah_2']['items'] == [{u'text': u'hello', u'id': u'C'}, {u'text': u'world', u'id': u'D'}]
3843 3843

  
3844 3844

  
3845 3845
def test_backoffice_criticality_in_formdef_listing(pub):
......
5211 5211
    formdata.store()
5212 5212

  
5213 5213
    resp = app.get(formdata.get_url(backoffice=True))
5214
    resp.forms[0]['f1'] = 'a'
5215
    resp.forms[0]['f2'] = 'b'
5214
    resp.forms[0]['flocal_1'] = 'a'
5215
    resp.forms[0]['flocal_2'] = 'b'
5216 5216
    resp = resp.forms[0].submit()
5217 5217
    assert formdata.select()[0].status == 'wf-done'
5218 5218

  
tests/form_pages/test_all.py
5973 5973
    formdata = formdef.data_class().select()[0]
5974 5974

  
5975 5975
    resp = app.get(formdata.get_url())
5976
    assert resp.form['f1'].attrs['aria-required'] == 'true'
5976
    assert resp.form['fxxx_1'].attrs['aria-required'] == 'true'
5977 5977
    assert 'button-action-1' in resp.form.fields
5978 5978
    resp = resp.form.submit('button-action-1')
5979 5979

  
......
6577 6577
    assert 'The form has been recorded' in resp.text
6578 6578

  
6579 6579
    assert 'data-live-url' in resp.html.find('form').attrs
6580
    assert 'f1' in resp.form.fields
6581
    assert 'f2' in resp.form.fields
6582
    assert resp.html.find('div', {'data-field-id': '2'}).attrs['data-live-source'] == 'true'
6583
    assert resp.html.find('div', {'data-field-id': '3'}).find('select')
6580
    assert 'fxxx_1' in resp.form.fields
6581
    assert 'fxxx_2' in resp.form.fields
6582
    assert resp.html.find('div', {'data-field-id': 'xxx_2'}).attrs['data-live-source'] == 'true'
6583
    assert resp.html.find('div', {'data-field-id': 'xxx_3'}).find('select')
6584 6584
    resp = resp.form.submit('submit')  # submit with error, to check <form> attributes
6585 6585
    assert 'data-live-url' in resp.html.find('form').attrs
6586
    assert 'f1' in resp.form.fields
6587
    assert 'f2' in resp.form.fields
6588
    assert resp.html.find('div', {'data-field-id': '2'}).attrs['data-live-source'] == 'true'
6589
    assert resp.html.find('div', {'data-field-id': '3'}).find('select')
6590
    resp.form['f1'] = 'hello'
6586
    assert 'fxxx_1' in resp.form.fields
6587
    assert 'fxxx_2' in resp.form.fields
6588
    assert resp.html.find('div', {'data-field-id': 'xxx_2'}).attrs['data-live-source'] == 'true'
6589
    assert resp.html.find('div', {'data-field-id': 'xxx_3'}).find('select')
6590
    resp.form['fxxx_1'] = 'hello'
6591 6591
    live_resp = app.post('/test/1/live', params=resp.form.submit_fields())
6592
    assert live_resp.json['result']['1']['visible']
6593
    assert live_resp.json['result']['2']['visible']
6594
    assert live_resp.json['result']['3']['visible']
6595
    assert not 'items' in live_resp.json['result']['3']
6596
    resp.form['f2'] = 'plop'
6597
    live_resp = app.post('/test/1/live?modified_field_id=2', params=resp.form.submit_fields())
6598
    assert live_resp.json['result']['1']['visible']
6599
    assert live_resp.json['result']['2']['visible']
6600
    assert live_resp.json['result']['3']['visible']
6601
    assert 'items' in live_resp.json['result']['3']
6602
    assert len(live_resp.json['result']['3']['items']) > 0
6603

  
6604
    resp.form['f3'].options = []
6605
    for item in live_resp.json['result']['3']['items']:
6592
    assert live_resp.json['result']['xxx_1']['visible']
6593
    assert live_resp.json['result']['xxx_2']['visible']
6594
    assert live_resp.json['result']['xxx_3']['visible']
6595
    assert not 'items' in live_resp.json['result']['xxx_3']
6596
    resp.form['fxxx_2'] = 'plop'
6597
    live_resp = app.post('/test/1/live?modified_field_id=xxx_2', params=resp.form.submit_fields())
6598
    assert live_resp.json['result']['xxx_1']['visible']
6599
    assert live_resp.json['result']['xxx_2']['visible']
6600
    assert live_resp.json['result']['xxx_3']['visible']
6601
    assert 'items' in live_resp.json['result']['xxx_3']
6602
    assert len(live_resp.json['result']['xxx_3']['items']) > 0
6603

  
6604
    resp.form['fxxx_3'].options = []
6605
    for item in live_resp.json['result']['xxx_3']['items']:
6606 6606
        # simulate javascript filling the <select>
6607
        resp.form['f3'].options.append((item['id'], False, item['text']))
6608
    resp.form['f3'] = 'a'
6607
        resp.form['fxxx_3'].options.append((item['id'], False, item['text']))
6608
    resp.form['fxxx_3'] = 'a'
6609 6609

  
6610 6610
    resp = resp.form.submit('submit')
6611 6611
    assert 'invalid value selected' not in resp
......
7129 7129

  
7130 7130
    app = login(get_app(pub), username='foo', password='foo')
7131 7131
    resp = app.get(formdata.get_url(backoffice=False))
7132
    assert 'f1' in resp.form.fields
7133
    assert 'f2' in resp.form.fields
7132
    assert 'fblah_1' in resp.form.fields
7133
    assert 'fblah_2' in resp.form.fields
7134 7134

  
7135 7135
    # check with static condition
7136 7136
    display_form.formdef.fields = [
......
7142 7142
    wf.store()
7143 7143

  
7144 7144
    resp = login(get_app(pub), username='foo', password='foo').get(formdata.get_url(backoffice=False))
7145
    assert 'f1' in resp.form.fields
7146
    assert 'f2' not in resp.form.fields
7145
    assert 'fblah_1' in resp.form.fields
7146
    assert 'fblah_2' not in resp.form.fields
7147 7147

  
7148 7148
    # check condition based on formdata
7149 7149
    display_form.formdef.fields = [
......
7155 7155
    wf.store()
7156 7156

  
7157 7157
    resp = login(get_app(pub), username='foo', password='foo').get(formdata.get_url(backoffice=False))
7158
    assert 'f1' in resp.form.fields
7159
    assert 'f2' in resp.form.fields
7158
    assert 'fblah_1' in resp.form.fields
7159
    assert 'fblah_2' in resp.form.fields
7160 7160

  
7161 7161
    display_form.formdef.fields = [
7162 7162
            fields.StringField(id='1', label='Test', varname='str', type='string', required=True),
......
7167 7167
    wf.store()
7168 7168

  
7169 7169
    resp = login(get_app(pub), username='foo', password='foo').get(formdata.get_url(backoffice=False))
7170
    assert 'f1' in resp.form.fields
7171
    assert 'f2' in resp.form.fields
7170
    assert 'fblah_1' in resp.form.fields
7171
    assert 'fblah_2' in resp.form.fields
7172 7172

  
7173 7173
    # check with live conditions
7174 7174
    display_form.formdef.fields = [
......
7180 7180
    wf.store()
7181 7181

  
7182 7182
    resp = login(get_app(pub), username='foo', password='foo').get(formdata.get_url(backoffice=False))
7183
    assert 'f1' in resp.form.fields
7184
    assert 'f2' in resp.form.fields
7185
    assert resp.html.find('div', {'data-field-id': '1'}).attrs['data-live-source'] == 'true'
7186
    assert resp.html.find('div', {'data-field-id': '2'}).attrs.get('style') == 'display: none'
7183
    assert 'fblah_1' in resp.form.fields
7184
    assert 'fblah_2' in resp.form.fields
7185
    assert resp.html.find('div', {'data-field-id': 'blah_1'}).attrs['data-live-source'] == 'true'
7186
    assert resp.html.find('div', {'data-field-id': 'blah_2'}).attrs.get('style') == 'display: none'
7187 7187
    live_url = resp.html.find('form').attrs['data-live-url']
7188
    resp.form['f1'] = ''
7188
    resp.form['fblah_1'] = ''
7189 7189
    live_resp = app.post(live_url, params=resp.form.submit_fields())
7190
    assert live_resp.json['result']['1']['visible']
7191
    assert not live_resp.json['result']['2']['visible']
7190
    assert live_resp.json['result']['blah_1']['visible']
7191
    assert not live_resp.json['result']['blah_2']['visible']
7192 7192

  
7193
    resp.form['f1'] = 'xxx'
7193
    resp.form['fblah_1'] = 'xxx'
7194 7194
    live_resp = app.post(live_url, params=resp.form.submit_fields())
7195
    assert live_resp.json['result']['1']['visible']
7196
    assert live_resp.json['result']['2']['visible']
7195
    assert live_resp.json['result']['blah_1']['visible']
7196
    assert live_resp.json['result']['blah_2']['visible']
7197 7197

  
7198 7198
    # check submit doesn't work
7199 7199
    resp = resp.form.submit('submit')
7200 7200
    assert 'There were errors processing your form.' in resp.text
7201 7201

  
7202
    resp.form['f1'] = 'xxx2'
7202
    resp.form['fblah_1'] = 'xxx2'
7203 7203
    live_resp = app.post(live_url, params=resp.form.submit_fields())
7204
    assert live_resp.json['result']['1']['visible']
7205
    assert not live_resp.json['result']['2']['visible']
7204
    assert live_resp.json['result']['blah_1']['visible']
7205
    assert not live_resp.json['result']['blah_2']['visible']
7206 7206

  
7207 7207
    # check submit does work when second field is hidden
7208 7208
    resp = resp.form.submit('submit').follow()
......
7246 7246

  
7247 7247
    app = login(get_app(pub), username='foo', password='foo')
7248 7248
    resp = app.get(formdata.get_url(backoffice=False))
7249
    assert 'f1' in resp.form.fields
7249
    assert 'fblah_1' in resp.form.fields
7250 7250

  
7251 7251
    live_url = resp.html.find('form').attrs['data-live-url']
7252
    resp.form['f1'] = 'test'
7252
    resp.form['fblah_1'] = 'test'
7253 7253
    live_resp = app.post(live_url, params=resp.form.submit_fields())
7254
    assert live_resp.json['result']['2']['visible']
7255
    assert live_resp.json['result']['2']['content'] == '<p>value is test</p>'
7254
    assert live_resp.json['result']['blah_2']['visible']
7255
    assert live_resp.json['result']['blah_2']['content'] == '<p>value is test</p>'
7256 7256

  
7257 7257

  
7258 7258
def test_frontoffice_workflow_form_with_impossible_condition(pub):
......
7292 7292

  
7293 7293
    app = login(get_app(pub), username='foo', password='foo')
7294 7294
    resp = app.get(formdata.get_url(backoffice=False))
7295
    assert 'f1' not in resp.form.fields
7296
    assert resp.html.find('div', {'data-field-id': '2'}).attrs.get('style') == 'display: none'
7295
    assert 'fblah_1' not in resp.form.fields
7296
    assert resp.html.find('div', {'data-field-id': 'blah_2'}).attrs.get('style') == 'display: none'
7297 7297

  
7298 7298

  
7299 7299
def test_choice_button_ignore_form_errors(pub):
tests/form_pages/test_block.py
412 412
    resp = resp.form.submit('submit')  # -> validation
413 413
    resp = resp.form.submit('submit').follow()
414 414
    assert 'The form has been recorded' in resp
415
    assert resp.form['f3$element0$f123'].value == 'foo@localhost'
415
    assert resp.form['fxxx_3$element0$f123'].value == 'foo@localhost'
416 416

  
417 417

  
418 418
def test_block_title_and_comment(pub, blocks_feature):
tests/form_pages/test_formdata.py
1037 1037
    assert 'The form has been recorded' in resp.text
1038 1038

  
1039 1039
    assert 'qommon.fileupload.js' in resp.text
1040
    resp.forms[0]['f1$file'] = Upload('test.txt', b'foobar', 'text/plain')
1040
    resp.forms[0]['fxxx_1$file'] = Upload('test.txt', b'foobar', 'text/plain')
1041 1041
    resp = resp.forms[0].submit('submit')
1042 1042

  
1043 1043
    assert formdef.data_class().count() == 1
......
1086 1086
    assert resp.status_int == 302
1087 1087
    resp = resp.follow()
1088 1088
    assert 'The form has been recorded' in resp.text
1089
    assert resp.forms[0]['f1'].value == 'foo@localhost'
1089
    assert resp.forms[0]['fxxx_1'].value == 'foo@localhost'
1090 1090

  
1091 1091

  
1092 1092
def test_formdata_workflow_form_prefill_conditional_field(pub):
......
1127 1127
    assert resp.status_int == 302
1128 1128
    resp = resp.follow()
1129 1129
    assert 'The form has been recorded' in resp.text
1130
    assert resp.forms[0]['f2'].value == 'foo@localhost'
1130
    assert resp.forms[0]['fxxx_2'].value == 'foo@localhost'
1131 1131

  
1132 1132

  
1133 1133
def test_formdata_workflow_form_prefill_checkbox(pub):
......
1164 1164
    assert 'Check values then click submit.' in resp
1165 1165
    resp = resp.form.submit('submit').follow()
1166 1166
    assert 'The form has been recorded' in resp
1167
    assert resp.form['f1'].checked is True
1168
    assert resp.form['f2'].checked is True
1169
    resp.form['f1'].checked = False
1167
    assert resp.form['fxxx_1'].checked is True
1168
    assert resp.form['fxxx_2'].checked is True
1169
    resp.form['fxxx_1'].checked = False
1170 1170
    resp = resp.form.submit('submit')
1171 1171

  
1172 1172
    formdata = formdef.data_class().select()[0]
......
1242 1242
        assert 'The form has been recorded' in resp
1243 1243

  
1244 1244
        # check display value is in form action widget
1245
        assert resp.form['f4'].attrs['data-value'] == '1'
1246
        assert resp.form['f4'].attrs['data-initial-display-value'] == 'hello'
1245
        assert resp.form['fxxx_4'].attrs['data-value'] == '1'
1246
        assert resp.form['fxxx_4'].attrs['data-initial-display-value'] == 'hello'
1247 1247

  
1248 1248
        # check it is also displayed in a fresh session
1249 1249
        resp = login(get_app(pub), username='foo', password='foo').get(resp.request.url)
1250
        assert resp.form['f4'].attrs['data-value'] == '1'
1251
        assert resp.form['f4'].attrs['data-initial-display-value'] == 'hello'
1250
        assert resp.form['fxxx_4'].attrs['data-value'] == '1'
1251
        assert resp.form['fxxx_4'].attrs['data-initial-display-value'] == 'hello'
1252

  
1253

  
1254
def test_formdata_workflow_many_forms(pub):
1255
    create_user(pub)
1256
    wf = Workflow(name='status')
1257
    st1 = wf.add_status('Status1', 'st1')
1258

  
1259
    # first form
1260
    display_form1 = FormWorkflowStatusItem()
1261
    display_form1.id = '_x'
1262
    display_form1.by = ['_submitter']
1263
    display_form1.varname = 'xxx'
1264
    display_form1.formdef = WorkflowFormFieldsFormDef(item=display_form1)
1265
    display_form1.formdef.fields = [fields.StringField(id='1', label='blah1')]
1266
    st1.items.append(display_form1)
1267
    display_form1.parent = st1
1268

  
1269
    # second form with live condition
1270
    display_form2 = FormWorkflowStatusItem()
1271
    display_form2.id = '_y'
1272
    display_form2.by = ['_submitter']
1273
    display_form2.varname = 'yyy'
1274
    display_form2.formdef = WorkflowFormFieldsFormDef(item=display_form2)
1275
    display_form2.formdef.fields = [
1276
        fields.StringField(id='1', label='Test', varname='str', type='string', required=True),
1277
        fields.StringField(
1278
            id='2', label='Test2', varname='str2',
1279
            type='string', required=True,
1280
            condition={'type': 'django', 'value': 'yyy_var_str == "xxx"'}),
1281
    ]
1282
    st1.items.append(display_form2)
1283
    display_form2.parent = st1
1284

  
1285
    wf.store()
1286

  
1287
    FormDef.wipe()
1288
    formdef = FormDef()
1289
    formdef.name = 'test'
1290
    formdef.workflow_id = wf.id
1291
    formdef.fields = [fields.StringField(id='1', label='blah')]
1292
    formdef.store()
1293
    formdef.data_class().wipe()
1294

  
1295
    app = login(get_app(pub), username='foo', password='foo')
1296
    resp = app.get('/test/')
1297
    resp.form['f1'] = 'foobar'
1298
    resp = resp.forms[0].submit('submit')
1299
    assert 'Check values then click submit.' in resp.text
1300
    resp = resp.forms[0].submit('submit')
1301
    assert resp.status_int == 302
1302
    resp = resp.follow()
1303
    assert 'The form has been recorded' in resp.text
1304
    assert 'fxxx_1' in resp.form.fields
1305
    assert 'fyyy_1' in resp.form.fields
1306
    assert 'fyyy_2' in resp.form.fields
1307
    assert 'submit' in resp.form.fields  # only one submit button
1308

  
1309
    assert resp.html.find('div', {'data-field-id': 'yyy_1'}).attrs['data-live-source'] == 'true'
1310
    assert resp.html.find('div', {'data-field-id': 'yyy_2'}).attrs.get('style') == 'display: none'
1311
    live_url = resp.html.find('form').attrs['data-live-url']
1312
    resp.form['fyyy_1'] = ''
1313
    live_resp = app.post(live_url, params=resp.form.submit_fields())
1314
    assert live_resp.json['result']['xxx_1']['visible']
1315
    assert live_resp.json['result']['yyy_1']['visible']
1316
    assert not live_resp.json['result']['yyy_2']['visible']
1317
    resp.form['fyyy_1'] = 'xxx'
1318
    live_resp = app.post(live_url, params=resp.form.submit_fields())
1319
    assert live_resp.json['result']['xxx_1']['visible']
1320
    assert live_resp.json['result']['yyy_1']['visible']
1321
    assert live_resp.json['result']['yyy_2']['visible']
1252 1322

  
1253 1323

  
1254 1324
def test_formdata_named_wscall(http_requests, pub):
tests/test_workflows.py
2413 2413
    assert form.widgets[1].title == 'Date'
2414 2414

  
2415 2415
    two_pubs.get_request().environ['REQUEST_METHOD'] = 'POST'
2416
    two_pubs.get_request().form = {'f1': 'Foobar', 'f2': '2015-05-12', 'submit': 'submit'}
2416
    two_pubs.get_request().form = {'fxxx_1': 'Foobar', 'fxxx_2': '2015-05-12', 'submit': 'submit'}
2417 2417
    display_form.submit_form(form, formdata, None, None)
2418 2418

  
2419 2419
    assert formdata.get_substitution_variables()['xxx_var_date'] == '2015-05-12'
......
2426 2426
    form = Form(action='#', use_tokens=False)
2427 2427
    display_form.fill_form(form, formdata, None)
2428 2428
    two_pubs.get_request().environ['REQUEST_METHOD'] = 'POST'
2429
    two_pubs.get_request().form = {'f1': 'Foobar', 'f2': '12/05/2015', 'submit': 'submit'}
2429
    two_pubs.get_request().form = {'fxxx_1': 'Foobar', 'fxxx_2': '12/05/2015', 'submit': 'submit'}
2430 2430
    display_form.submit_form(form, formdata, None, None)
2431 2431
    assert formdata.get_substitution_variables()['xxx_var_date'] == '12/05/2015'
2432 2432

  
wcs/fields.py
550 550
    def perform_more_widget_changes(self, form, kwargs, edit = True):
551 551
        pass
552 552

  
553

  
554 553
    def add_to_view_form(self, form, value = None):
555 554
        kwargs = {'render_br': False}
556 555

  
wcs/wf/form.py
165 165
            return fields_directory
166 166
        return None
167 167

  
168
    def prefix_form_fields(self):
169
        for field in self.formdef.fields:
170
            try:
171
                field.id = '%s_%s' % (self.varname, int(field.id))
172
            except ValueError:
173
                # already prefixed
174
                pass
175

  
168 176
    def fill_form(self, form, formdata, user, displayed_fields=None, **kwargs):
169 177
        if not self.formdef:
170 178
            return
179
        self.prefix_form_fields()
171 180
        self.formdef.var_prefix = self.varname
172 181
        self.formdef.add_fields_to_form(form, displayed_fields=displayed_fields)
173
        form.add_submit('submit', _('Submit'))
182
        if 'submit' not in form._names:
183
            form.add_submit('submit', _('Submit'))
174 184

  
175 185
        # put varname in a form attribute so it can be used in templates to
176 186
        # identify the form.
......
192 202

  
193 203
    def evaluate_live_form(self, form, formdata, user):
194 204
        workflow_data = {}
205
        self.prefix_form_fields()
195 206
        for k, v in get_dict_with_varnames(
196 207
                        self.formdef.fields, self.formdef.get_data(form),
197 208
                        varnames_only=True).items():
198
-