forms: give prefilling access to form_parent_* variables (#54220)

This commit is contained in:
Frédéric Péters 2021-06-14 13:40:53 +02:00
parent 4fb8aee1c8
commit 00540aa4f8
2 changed files with 53 additions and 0 deletions

View File

@ -8632,6 +8632,49 @@ def test_create_formdata_empty_item_ds_with_id_parameter(pub, create_formdata):
assert pub.loggederror_class.count() == 0
def test_create_formdata_locked_prefill_parent(create_formdata):
create_formdata['source_formdef'].data_class().wipe()
create_formdata['target_formdef'].data_class().wipe()
target_formdef = create_formdata['target_formdef']
target_formdef.fields[0].prefill = {
'type': 'string',
'value': '{{form_parent_form_var_toto_string}}',
'locked': True,
}
target_formdef.store()
app = get_app(create_formdata['pub'])
resp = app.get('/source-form/')
resp.form['f0'] = 'zob'
resp.form['f1$file'] = Upload('test.txt', b'foobar', 'text/plain')
resp.form['f2'] = '2'
resp = resp.form.submit('submit') # -> validation
resp = resp.form.submit('submit') # -> submission
resp = resp.follow()
assert create_formdata['target_formdef'].data_class().count() == 0
resp = resp.form.submit('button_resubmit')
assert create_formdata['target_formdef'].data_class().count() == 1
target_formdata = create_formdata['target_formdef'].data_class().select()[0]
assert target_formdata.data.get('0') == 'zob'
assert target_formdata.status == 'draft'
resp = resp.follow()
resp = resp.follow()
assert resp.forms[1]['f0'].value == 'zob'
assert resp.forms[1]['f0'].attrs['readonly']
# try altering readonly field
resp.forms[1]['f0'].value = 'xxx'
resp = resp.forms[1].submit('submit')
resp = resp.forms[1].submit('previous')
assert resp.forms[1]['f0'].value == 'zob'
resp = resp.forms[1].submit('submit')
resp = resp.forms[1].submit('submit')
assert create_formdata['target_formdef'].data_class().count() == 1
target_formdata = create_formdata['target_formdef'].data_class().select()[0]
assert target_formdata.data['0'] == 'zob'
def test_js_libraries(pub):
create_formdef()
resp = get_app(pub).get('/test/', status=200)

View File

@ -739,6 +739,16 @@ class FormPage(Directory, FormTemplateMixin):
formdata.workflow_data = self.edited_data.workflow_data
return formdata
if formdata.data.get('is_recalled_draft'):
# restore submission context, this is required to get access to form_parent_* variables
draft_formdata_id = formdata.data.get('draft_formdata_id')
try:
draft_formdata = self.formdef.data_class().get(draft_formdata_id)
except KeyError: # it may not exist
pass
else:
formdata.submission_context = draft_formdata.submission_context
if get_request().is_in_backoffice():
formdata.user_id = None
draft_formdata_id = formdata.data.get('draft_formdata_id')