workflows: don't prefill fields that were conditioned out (#34844)

This commit is contained in:
Frédéric Péters 2019-07-15 14:02:58 +02:00
parent cbd2d35788
commit b9db059a47
2 changed files with 42 additions and 1 deletions

View File

@ -3796,6 +3796,43 @@ def test_formdata_workflow_form_prefill(pub):
assert 'The form has been recorded' in resp.body
assert resp.forms[0]['f1'].value == 'foo@localhost'
def test_formdata_workflow_form_prefill_conditional_field(pub):
create_user(pub)
wf = Workflow(name='status')
st1 = wf.add_status('Status1', 'st1')
display_form = FormWorkflowStatusItem()
display_form.id = '_x'
display_form.by = ['_submitter']
display_form.varname = 'xxx'
display_form.formdef = WorkflowFormFieldsFormDef(item=display_form)
display_form.formdef.fields.append(fields.StringField(id='1', label='blah1',
type='string', varname='yyy1', prefill={'type': 'user', 'value': 'email'},
condition={'type': 'django', 'value': '0'}))
display_form.formdef.fields.append(fields.StringField(id='2', label='blah2',
type='string', varname='yyy2', prefill={'type': 'user', 'value': 'email'},
condition={'type': 'django', 'value': '1'}))
st1.items.append(display_form)
display_form.parent = st1
wf.store()
formdef = create_formdef()
formdef.workflow_id = wf.id
formdef.fields = []
formdef.store()
formdef.data_class().wipe()
resp = login(get_app(pub), username='foo', password='foo').get('/test/')
resp = resp.forms[0].submit('submit')
assert 'Check values then click submit.' in resp.body
resp = resp.forms[0].submit('submit')
assert resp.status_int == 302
resp = resp.follow()
assert 'The form has been recorded' in resp.body
assert resp.forms[0]['f2'].value == 'foo@localhost'
def test_form_map_field_back_and_submit(pub):
formdef = create_formdef()
formdef.fields = [

View File

@ -169,7 +169,11 @@ class FormWorkflowStatusItem(WorkflowStatusItem):
req = get_request()
self.formdef.set_live_condition_sources(form, self.formdef.fields)
for field in self.formdef.fields:
fields = self.formdef.fields
if displayed_fields is not None:
fields = displayed_fields
for field in fields:
if ('f%s' % field.id) in req.form:
continue
if not field.prefill or field.prefill.get('type') == 'none':