0001-forms-mark-string-fields-with-html5-autocomplete-att.patch
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 |
- |