Projet

Général

Profil

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

Lauréline Guérin, 17 novembre 2020 14:26

Télécharger (23,3 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  |  65 +++++++++++++++---
 tests/test_workflows.py            |   4 +-
 wcs/fields.py                      |   1 -
 wcs/wf/form.py                     |   9 ++-
 7 files changed, 151 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
5893 5893
    formdata = formdef.data_class().select()[0]
5894 5894

  
5895 5895
    resp = app.get(formdata.get_url())
5896
    assert resp.form['f1'].attrs['aria-required'] == 'true'
5896
    assert resp.form['fxxx_1'].attrs['aria-required'] == 'true'
5897 5897
    assert 'button-action-1' in resp.form.fields
5898 5898
    resp = resp.form.submit('button-action-1')
5899 5899

  
......
6497 6497
    assert 'The form has been recorded' in resp.text
6498 6498

  
6499 6499
    assert 'data-live-url' in resp.html.find('form').attrs
6500
    assert 'f1' in resp.form.fields
6501
    assert 'f2' in resp.form.fields
6502
    assert resp.html.find('div', {'data-field-id': '2'}).attrs['data-live-source'] == 'true'
6503
    assert resp.html.find('div', {'data-field-id': '3'}).find('select')
6500
    assert 'fxxx_1' in resp.form.fields
6501
    assert 'fxxx_2' in resp.form.fields
6502
    assert resp.html.find('div', {'data-field-id': 'xxx_2'}).attrs['data-live-source'] == 'true'
6503
    assert resp.html.find('div', {'data-field-id': 'xxx_3'}).find('select')
6504 6504
    resp = resp.form.submit('submit')  # submit with error, to check <form> attributes
6505 6505
    assert 'data-live-url' in resp.html.find('form').attrs
6506
    assert 'f1' in resp.form.fields
6507
    assert 'f2' in resp.form.fields
6508
    assert resp.html.find('div', {'data-field-id': '2'}).attrs['data-live-source'] == 'true'
6509
    assert resp.html.find('div', {'data-field-id': '3'}).find('select')
6510
    resp.form['f1'] = 'hello'
6506
    assert 'fxxx_1' in resp.form.fields
6507
    assert 'fxxx_2' in resp.form.fields
6508
    assert resp.html.find('div', {'data-field-id': 'xxx_2'}).attrs['data-live-source'] == 'true'
6509
    assert resp.html.find('div', {'data-field-id': 'xxx_3'}).find('select')
6510
    resp.form['fxxx_1'] = 'hello'
6511 6511
    live_resp = app.post('/test/1/live', params=resp.form.submit_fields())
6512
    assert live_resp.json['result']['1']['visible']
6513
    assert live_resp.json['result']['2']['visible']
6514
    assert live_resp.json['result']['3']['visible']
6515
    assert not 'items' in live_resp.json['result']['3']
6516
    resp.form['f2'] = 'plop'
6517
    live_resp = app.post('/test/1/live?modified_field_id=2', params=resp.form.submit_fields())
6518
    assert live_resp.json['result']['1']['visible']
6519
    assert live_resp.json['result']['2']['visible']
6520
    assert live_resp.json['result']['3']['visible']
6521
    assert 'items' in live_resp.json['result']['3']
6522
    assert len(live_resp.json['result']['3']['items']) > 0
6523

  
6524
    resp.form['f3'].options = []
6525
    for item in live_resp.json['result']['3']['items']:
6512
    assert live_resp.json['result']['xxx_1']['visible']
6513
    assert live_resp.json['result']['xxx_2']['visible']
6514
    assert live_resp.json['result']['xxx_3']['visible']
6515
    assert not 'items' in live_resp.json['result']['xxx_3']
6516
    resp.form['fxxx_2'] = 'plop'
6517
    live_resp = app.post('/test/1/live?modified_field_id=xxx_2', params=resp.form.submit_fields())
6518
    assert live_resp.json['result']['xxx_1']['visible']
6519
    assert live_resp.json['result']['xxx_2']['visible']
6520
    assert live_resp.json['result']['xxx_3']['visible']
6521
    assert 'items' in live_resp.json['result']['xxx_3']
6522
    assert len(live_resp.json['result']['xxx_3']['items']) > 0
6523

  
6524
    resp.form['fxxx_3'].options = []
6525
    for item in live_resp.json['result']['xxx_3']['items']:
6526 6526
        # simulate javascript filling the <select>
6527
        resp.form['f3'].options.append((item['id'], False, item['text']))
6528
    resp.form['f3'] = 'a'
6527
        resp.form['fxxx_3'].options.append((item['id'], False, item['text']))
6528
    resp.form['fxxx_3'] = 'a'
6529 6529

  
6530 6530
    resp = resp.form.submit('submit')
6531 6531
    assert 'invalid value selected' not in resp
......
7049 7049

  
7050 7050
    app = login(get_app(pub), username='foo', password='foo')
7051 7051
    resp = app.get(formdata.get_url(backoffice=False))
7052
    assert 'f1' in resp.form.fields
7053
    assert 'f2' in resp.form.fields
7052
    assert 'fblah_1' in resp.form.fields
7053
    assert 'fblah_2' in resp.form.fields
7054 7054

  
7055 7055
    # check with static condition
7056 7056
    display_form.formdef.fields = [
......
7062 7062
    wf.store()
7063 7063

  
7064 7064
    resp = login(get_app(pub), username='foo', password='foo').get(formdata.get_url(backoffice=False))
7065
    assert 'f1' in resp.form.fields
7066
    assert 'f2' not in resp.form.fields
7065
    assert 'fblah_1' in resp.form.fields
7066
    assert 'fblah_2' not in resp.form.fields
7067 7067

  
7068 7068
    # check condition based on formdata
7069 7069
    display_form.formdef.fields = [
......
7075 7075
    wf.store()
7076 7076

  
7077 7077
    resp = login(get_app(pub), username='foo', password='foo').get(formdata.get_url(backoffice=False))
7078
    assert 'f1' in resp.form.fields
7079
    assert 'f2' in resp.form.fields
7078
    assert 'fblah_1' in resp.form.fields
7079
    assert 'fblah_2' in resp.form.fields
7080 7080

  
7081 7081
    display_form.formdef.fields = [
7082 7082
            fields.StringField(id='1', label='Test', varname='str', type='string', required=True),
......
7087 7087
    wf.store()
7088 7088

  
7089 7089
    resp = login(get_app(pub), username='foo', password='foo').get(formdata.get_url(backoffice=False))
7090
    assert 'f1' in resp.form.fields
7091
    assert 'f2' in resp.form.fields
7090
    assert 'fblah_1' in resp.form.fields
7091
    assert 'fblah_2' in resp.form.fields
7092 7092

  
7093 7093
    # check with live conditions
7094 7094
    display_form.formdef.fields = [
......
7100 7100
    wf.store()
7101 7101

  
7102 7102
    resp = login(get_app(pub), username='foo', password='foo').get(formdata.get_url(backoffice=False))
7103
    assert 'f1' in resp.form.fields
7104
    assert 'f2' in resp.form.fields
7105
    assert resp.html.find('div', {'data-field-id': '1'}).attrs['data-live-source'] == 'true'
7106
    assert resp.html.find('div', {'data-field-id': '2'}).attrs.get('style') == 'display: none'
7103
    assert 'fblah_1' in resp.form.fields
7104
    assert 'fblah_2' in resp.form.fields
7105
    assert resp.html.find('div', {'data-field-id': 'blah_1'}).attrs['data-live-source'] == 'true'
7106
    assert resp.html.find('div', {'data-field-id': 'blah_2'}).attrs.get('style') == 'display: none'
7107 7107
    live_url = resp.html.find('form').attrs['data-live-url']
7108
    resp.form['f1'] = ''
7108
    resp.form['fblah_1'] = ''
7109 7109
    live_resp = app.post(live_url, params=resp.form.submit_fields())
7110
    assert live_resp.json['result']['1']['visible']
7111
    assert not live_resp.json['result']['2']['visible']
7110
    assert live_resp.json['result']['blah_1']['visible']
7111
    assert not live_resp.json['result']['blah_2']['visible']
7112 7112

  
7113
    resp.form['f1'] = 'xxx'
7113
    resp.form['fblah_1'] = 'xxx'
7114 7114
    live_resp = app.post(live_url, params=resp.form.submit_fields())
7115
    assert live_resp.json['result']['1']['visible']
7116
    assert live_resp.json['result']['2']['visible']
7115
    assert live_resp.json['result']['blah_1']['visible']
7116
    assert live_resp.json['result']['blah_2']['visible']
7117 7117

  
7118 7118
    # check submit doesn't work
7119 7119
    resp = resp.form.submit('submit')
7120 7120
    assert 'There were errors processing your form.' in resp.text
7121 7121

  
7122
    resp.form['f1'] = 'xxx2'
7122
    resp.form['fblah_1'] = 'xxx2'
7123 7123
    live_resp = app.post(live_url, params=resp.form.submit_fields())
7124
    assert live_resp.json['result']['1']['visible']
7125
    assert not live_resp.json['result']['2']['visible']
7124
    assert live_resp.json['result']['blah_1']['visible']
7125
    assert not live_resp.json['result']['blah_2']['visible']
7126 7126

  
7127 7127
    # check submit does work when second field is hidden
7128 7128
    resp = resp.form.submit('submit').follow()
......
7166 7166

  
7167 7167
    app = login(get_app(pub), username='foo', password='foo')
7168 7168
    resp = app.get(formdata.get_url(backoffice=False))
7169
    assert 'f1' in resp.form.fields
7169
    assert 'fblah_1' in resp.form.fields
7170 7170

  
7171 7171
    live_url = resp.html.find('form').attrs['data-live-url']
7172
    resp.form['f1'] = 'test'
7172
    resp.form['fblah_1'] = 'test'
7173 7173
    live_resp = app.post(live_url, params=resp.form.submit_fields())
7174
    assert live_resp.json['result']['2']['visible']
7175
    assert live_resp.json['result']['2']['content'] == '<p>value is test</p>'
7174
    assert live_resp.json['result']['blah_2']['visible']
7175
    assert live_resp.json['result']['blah_2']['content'] == '<p>value is test</p>'
7176 7176

  
7177 7177

  
7178 7178
def test_frontoffice_workflow_form_with_impossible_condition(pub):
......
7212 7212

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

  
7218 7218

  
7219 7219
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
    display_form1 = FormWorkflowStatusItem()
1260
    display_form1.id = '_x'
1261
    display_form1.by = ['_submitter']
1262
    display_form1.varname = 'xxx'
1263
    display_form1.formdef = WorkflowFormFieldsFormDef(item=display_form1)
1264
    display_form1.formdef.fields.append(fields.StringField(id='1', label='blah1'))
1265
    st1.items.append(display_form1)
1266
    display_form1.parent = st1
1267

  
1268
    display_form2 = FormWorkflowStatusItem()
1269
    display_form2.id = '_y'
1270
    display_form2.by = ['_submitter']
1271
    display_form2.varname = 'yyy'
1272
    display_form2.formdef = WorkflowFormFieldsFormDef(item=display_form2)
1273
    display_form2.formdef.fields.append(fields.StringField(id='1', label='blah2'))
1274
    st1.items.append(display_form2)
1275
    display_form2.parent = st1
1276

  
1277
    wf.store()
1278

  
1279
    FormDef.wipe()
1280
    formdef = FormDef()
1281
    formdef.name = 'test'
1282
    formdef.workflow_id = wf.id
1283
    formdef.fields = []
1284
    formdef.store()
1285
    formdef.data_class().wipe()
1286

  
1287
    resp = login(get_app(pub), username='foo', password='foo').get('/test/')
1288
    resp = resp.forms[0].submit('submit')
1289
    assert 'Check values then click submit.' in resp.text
1290
    resp = resp.forms[0].submit('submit')
1291
    assert resp.status_int == 302
1292
    resp = resp.follow()
1293
    assert 'The form has been recorded' in resp.text
1294
    assert 'fxxx_1' in resp.form.fields
1295
    assert 'fyyy_1' in resp.form.fields
1296
    assert 'submit' in resp.form.fields
1252 1297

  
1253 1298

  
1254 1299
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
546 546
    def perform_more_widget_changes(self, form, kwargs, edit = True):
547 547
        pass
548 548

  
549

  
550 549
    def add_to_view_form(self, form, value = None):
551 550
        kwargs = {'render_br': False}
552 551

  
wcs/wf/form.py
168 168
    def fill_form(self, form, formdata, user, displayed_fields=None, **kwargs):
169 169
        if not self.formdef:
170 170
            return
171
        for field in self.formdef.fields:
172
            try:
173
                field.id = '%s_%s' % (self.varname, int(field.id))
174
            except ValueError:
175
                # already prefixed
176
                pass
171 177
        self.formdef.var_prefix = self.varname
172 178
        self.formdef.add_fields_to_form(form, displayed_fields=displayed_fields)
173
        form.add_submit('submit', _('Submit'))
179
        if 'submit' not in form._names:
180
            form.add_submit('submit', _('Submit'))
174 181

  
175 182
        # put varname in a form attribute so it can be used in templates to
176 183
        # identify the form.
177
-