Projet

Général

Profil

0001-forms-keep-locked-field-as-readonly-on-page-with-err.patch

Frédéric Péters, 07 avril 2020 14:16

Télécharger (3,17 ko)

Voir les différences:

Subject: [PATCH] forms: keep locked field as readonly on page with errors
 (#41411)

 tests/test_form_pages.py | 28 ++++++++++++++++++++++++++++
 wcs/forms/root.py        | 11 +++++++++++
 2 files changed, 39 insertions(+)
tests/test_form_pages.py
5321 5321
        assert formdatas[0].data['0'] == 'foo@localhost'
5322 5322

  
5323 5323

  
5324
def test_form_page_verified_prefill_error_page(pub):
5325
    user = create_user(pub)
5326
    user.verified_fields = ['email']
5327
    user.store()
5328
    formdef = create_formdef()
5329
    formdef.data_class().wipe()
5330
    formdef.fields = [
5331
        fields.StringField(id='0', label='string', required=False),
5332
        fields.StringField(id='1', label='string2', required=True),
5333
    ]
5334
    formdef.store()
5335

  
5336
    for prefill_settings in (
5337
            {'type': 'user', 'value': 'email'},  # verified profile
5338
            {'type': 'string', 'value': 'foo@localhost', 'locked': True},  # locked value
5339
        ):
5340
        formdef.fields[0].prefill = prefill_settings
5341
        formdef.store()
5342
        formdef.data_class().wipe()
5343
        resp = login(get_app(pub), username='foo', password='foo').get('/test/')
5344
        assert resp.form['f0'].value == 'foo@localhost'
5345
        assert 'readonly' in resp.form['f0'].attrs
5346

  
5347
        resp = resp.form.submit('submit')
5348
        assert 'There were errors processing the form' in resp.text
5349
        assert 'readonly' in resp.form['f0'].attrs
5350

  
5351

  
5324 5352
def test_form_page_profile_verified_date_prefill(pub):
5325 5353
    user = create_user(pub)
5326 5354

  
wcs/forms/root.py
410 410
            else:
411 411
                req.form = {}
412 412

  
413
        else:
414
            # not a page change, reset_locked_data() will have been called
415
            # earlier, we use that to set appropriate fields as readonly.
416
            for field in displayed_fields:
417
                if get_request().form.get('__locked_f%s' % field.id):
418
                    form.get_widget('f%s' % field.id).readonly = 'readonly'
419
                    form.get_widget('f%s' % field.id).attrs['readonly'] = 'readonly'
420

  
413 421
        for field in displayed_fields:
414 422
            if field.prefill:
415 423
                # always set additional attributes as they will be used for
......
973 981
                    # submitted by the browser.
974 982
                    v = field.convert_value_to_str(v)
975 983
                get_request().form['f%s' % field.id] = v
984
                # keep track of locked field, this will be used when
985
                # redisplaying the same page in case of errors.
986
                get_request().form['__locked_f%s' % field.id] = True
976 987

  
977 988
    def previous_page(self, page_no, magictoken):
978 989
        session = get_session()
979
-