Projet

Général

Profil

0001-forms-mark-string-fields-with-html5-autocomplete-att.patch

Frédéric Péters, 30 septembre 2018 15:40

Télécharger (4,75 ko)

Voir les différences:

Subject: [PATCH] forms: mark string fields with html5 autocomplete attributes
 (#26827)

 tests/test_form_pages.py | 28 ++++++++++++++++++++++++++++
 wcs/ctl/check_hobos.py   | 14 ++++++++++++++
 wcs/fields.py            | 14 ++++++++++++++
 wcs/qommon/form.py       |  2 ++
 4 files changed, 58 insertions(+)
tests/test_form_pages.py
2038 2038
    resp = login(get_app(pub), username='foo', password='foo').get('/test/')
2039 2039
    assert resp.forms[0]['f0'].value == 'foo@localhost'
2040 2040

  
2041
def test_form_page_profile_first_name_prefill(pub):
2042
    user = create_user(pub)
2043

  
2044
    from wcs.admin.settings import UserFieldsFormDef
2045
    user_formdef = UserFieldsFormDef(pub)
2046
    user_formdef.fields = [
2047
        fields.StringField(
2048
            id='_first_name', label='first name',
2049
            type='string', extra_css_class='autocomplete-given-name')
2050
    ]
2051
    user_formdef.store()
2052
    user.form_data = {'_first_name': 'plop'}
2053
    user.set_attributes_from_formdata(user.form_data)
2054
    user.store()
2055

  
2056
    formdef = create_formdef()
2057
    formdef.data_class().wipe()
2058
    formdef.fields = [fields.StringField(id='0', label='string',
2059
        prefill={'type': 'user', 'value': '_first_name'})]
2060
    formdef.store()
2061

  
2062
    resp = get_app(pub).get('/test/')
2063
    assert resp.forms[0]['f0'].value == ''
2064
    assert resp.forms[0]['f0'].attrs['autocomplete'] == 'given-name'  # html5
2065

  
2066
    resp = login(get_app(pub), username='foo', password='foo').get('/test/')
2067
    assert resp.forms[0]['f0'].value == 'plop'
2068

  
2041 2069
def test_form_page_formula_prefill(pub):
2042 2070
    user = create_user(pub)
2043 2071
    formdef = create_formdef()
wcs/ctl/check_hobos.py
218 218
            if field.id in profile_field_ids:
219 219
                profile_fields[field.id] = field
220 220

  
221
        html5_autocomplete_map = {
222
            'first_name': 'given-name',
223
            'last_name': 'family-name',
224
            'address': 'address-line1',
225
            'zipcode': 'postal-code',
226
            'city': 'address-level2',
227
            'country': 'country',
228
            'phone': 'tel',
229
            'email': 'email',
230
        }
231

  
221 232
        # create or update profile fields
222 233
        for attribute in profile.get('fields', []):
223 234
            field_id = '_' + attribute['name']
......
242 253

  
243 254
            if attribute['disabled']:
244 255
                profile_field_ids.remove('_' + attribute['name'])
256
            if attribute['name'] in html5_autocomplete_map:
257
                profile_fields[field_id].extra_css_class = (
258
                        'autocomplete-%s' % html5_autocomplete_map[attribute['name']])
245 259

  
246 260
        # insert profile fields at the beginning
247 261
        formdef.fields = [profile_fields[x] for x in profile_field_ids] + formdef.fields
wcs/fields.py
362 362

  
363 363
    def get_prefill_attributes(self):
364 364
        t = self.prefill.get('type')
365

  
365 366
        if t == 'geolocation':
366 367
            return {'geolocation': self.prefill.get('value')}
368

  
369
        if t == 'user':
370
            formdef = get_publisher().user_class.get_formdef()
371
            for user_field in formdef.fields or []:
372
                if user_field.id != self.prefill.get('value'):
373
                    continue
374
                try:
375
                    autocomplete_attribute = re.search(r'\bautocomplete-([a-z-]+)',
376
                            user_field.extra_css_class).groups()[0]
377
                except (TypeError, IndexError):
378
                    continue
379
                return {'autocomplete': autocomplete_attribute}
380

  
367 381
        return None
368 382

  
369 383
    def feed_session(self, value, display_value):
wcs/qommon/form.py
147 147
    attrs = {'id': 'form_' + self.name}
148 148
    if self.required:
149 149
        attrs['aria-required'] = 'true'
150
    if getattr(self, 'prefill_attributes', None) and 'autocomplete' in self.prefill_attributes:
151
        attrs['autocomplete'] = self.prefill_attributes['autocomplete']
150 152
    if self.attrs:
151 153
        attrs.update(self.attrs)
152 154
    return htmltag("input", xml_end=True, type=self.HTML_TYPE, name=self.name,
153
-