forms: keep locked field as readonly on page with errors (#41411)
This commit is contained in:
parent
f22d7ece81
commit
e4cc1efaed
|
@ -5307,6 +5307,34 @@ def test_form_page_profile_verified_prefill(pub):
|
|||
assert formdatas[0].data['0'] == 'foo@localhost'
|
||||
|
||||
|
||||
def test_form_page_verified_prefill_error_page(pub):
|
||||
user = create_user(pub)
|
||||
user.verified_fields = ['email']
|
||||
user.store()
|
||||
formdef = create_formdef()
|
||||
formdef.data_class().wipe()
|
||||
formdef.fields = [
|
||||
fields.StringField(id='0', label='string', required=False),
|
||||
fields.StringField(id='1', label='string2', required=True),
|
||||
]
|
||||
formdef.store()
|
||||
|
||||
for prefill_settings in (
|
||||
{'type': 'user', 'value': 'email'}, # verified profile
|
||||
{'type': 'string', 'value': 'foo@localhost', 'locked': True}, # locked value
|
||||
):
|
||||
formdef.fields[0].prefill = prefill_settings
|
||||
formdef.store()
|
||||
formdef.data_class().wipe()
|
||||
resp = login(get_app(pub), username='foo', password='foo').get('/test/')
|
||||
assert resp.form['f0'].value == 'foo@localhost'
|
||||
assert 'readonly' in resp.form['f0'].attrs
|
||||
|
||||
resp = resp.form.submit('submit')
|
||||
assert 'There were errors processing the form' in resp.text
|
||||
assert 'readonly' in resp.form['f0'].attrs
|
||||
|
||||
|
||||
def test_form_page_profile_verified_date_prefill(pub):
|
||||
user = create_user(pub)
|
||||
|
||||
|
|
|
@ -406,6 +406,14 @@ class FormPage(Directory, FormTemplateMixin):
|
|||
else:
|
||||
req.form = {}
|
||||
|
||||
else:
|
||||
# not a page change, reset_locked_data() will have been called
|
||||
# earlier, we use that to set appropriate fields as readonly.
|
||||
for field in displayed_fields:
|
||||
if get_request().form.get('__locked_f%s' % field.id):
|
||||
form.get_widget('f%s' % field.id).readonly = 'readonly'
|
||||
form.get_widget('f%s' % field.id).attrs['readonly'] = 'readonly'
|
||||
|
||||
for field in displayed_fields:
|
||||
if field.prefill:
|
||||
# always set additional attributes as they will be used for
|
||||
|
@ -969,6 +977,9 @@ class FormPage(Directory, FormTemplateMixin):
|
|||
# submitted by the browser.
|
||||
v = field.convert_value_to_str(v)
|
||||
get_request().form['f%s' % field.id] = v
|
||||
# keep track of locked field, this will be used when
|
||||
# redisplaying the same page in case of errors.
|
||||
get_request().form['__locked_f%s' % field.id] = True
|
||||
|
||||
def previous_page(self, page_no, magictoken):
|
||||
session = get_session()
|
||||
|
|
Loading…
Reference in New Issue