Projet

Général

Profil

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

Emmanuel Cazenave, 03 janvier 2019 17:29

Télécharger (5,25 ko)

Voir les différences:

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

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

  
2114
def test_form_page_profile_first_name_prefill(pub):
2115
    user = create_user(pub)
2116

  
2117
    from wcs.admin.settings import UserFieldsFormDef
2118
    user_formdef = UserFieldsFormDef(pub)
2119
    user_formdef.fields = [
2120
        fields.StringField(
2121
            id='_first_name', label='first name',
2122
            type='string', extra_css_class='autocomplete-given-name'),
2123
        fields.StringField(
2124
            id='_city', label='city',
2125
            type='string', extra_css_class='autocomplete-address-level2')
2126
    ]
2127
    user_formdef.store()
2128
    user.form_data = {'_first_name': 'plop', '_city': 'mytown'}
2129
    user.set_attributes_from_formdata(user.form_data)
2130
    user.store()
2131

  
2132
    formdef = create_formdef()
2133
    formdef.data_class().wipe()
2134
    formdef.fields = [
2135
        fields.StringField(
2136
            id='0', label='string',
2137
            prefill={'type': 'user', 'value': '_first_name'}),
2138
        fields.StringField(
2139
            id='1', label='string',
2140
            prefill={'type': 'user', 'value': '_city'})
2141
    ]
2142
    formdef.store()
2143

  
2144
    resp = get_app(pub).get('/test/')
2145
    assert resp.forms[0]['f0'].value == ''
2146
    assert resp.forms[0]['f0'].attrs['autocomplete'] == 'given-name'  # html5
2147
    assert resp.forms[0]['f1'].value == ''
2148
    assert resp.forms[0]['f1'].attrs['autocomplete'] == 'address-level2'  # html5
2149

  
2150
    resp = login(get_app(pub), username='foo', password='foo').get('/test/')
2151
    assert resp.forms[0]['f0'].value == 'plop'
2152
    assert resp.forms[0]['f1'].value == 'mytown'
2153

  
2114 2154
def test_form_page_formula_prefill(pub):
2115 2155
    user = create_user(pub)
2116 2156
    formdef = create_formdef()
wcs/ctl/check_hobos.py
217 217
            if field.id in profile_field_ids:
218 218
                profile_fields[field.id] = field
219 219

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

  
220 231
        # create or update profile fields
221 232
        for attribute in profile.get('fields', []):
222 233
            field_id = '_' + attribute['name']
......
241 252

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

  
245 259
        # insert profile fields at the beginning
246 260
        formdef.fields = [profile_fields[x] for x in profile_field_ids] + formdef.fields
wcs/fields.py
369 369

  
370 370
    def get_prefill_attributes(self):
371 371
        t = self.prefill.get('type')
372

  
372 373
        if t == 'geolocation':
373 374
            return {'geolocation': self.prefill.get('value')}
375

  
376
        if t == 'user':
377
            formdef = get_publisher().user_class.get_formdef()
378
            for user_field in formdef.fields or []:
379
                if user_field.id != self.prefill.get('value'):
380
                    continue
381
                try:
382
                    autocomplete_attribute = re.search(r'\bautocomplete-([a-z0-9-]+)',
383
                            user_field.extra_css_class).groups()[0]
384
                except (TypeError, IndexError):
385
                    continue
386
                return {'autocomplete': autocomplete_attribute}
387

  
374 388
        return None
375 389

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