0003-fields-prefill-users-phone-number-value-69838.patch
tests/form_pages/test_all.py | ||
---|---|---|
16 | 16 |
from webtest import Hidden, Radio, Upload |
17 | 17 | |
18 | 18 |
from wcs import fields |
19 |
from wcs.admin.settings import UserFieldsFormDef |
|
19 | 20 |
from wcs.blocks import BlockDef |
20 | 21 |
from wcs.carddef import CardDef |
21 | 22 |
from wcs.categories import Category |
... | ... | |
71 | 72 |
pub = create_temporary_pub(lazy_mode=bool('lazy' in request.param)) |
72 | 73 |
pub.cfg['identification'] = {'methods': ['password']} |
73 | 74 |
pub.cfg['language'] = {'language': 'en'} |
75 |
pub.cfg['users'] = { |
|
76 |
'field_phone': '_phone', |
|
77 |
} |
|
74 | 78 |
pub.write_cfg() |
75 | 79 | |
80 |
formdef = UserFieldsFormDef(pub) |
|
81 |
formdef.fields = [fields.StringField(id='_phone', label='phone', type='string', varname='phone')] |
|
82 |
formdef.store() |
|
83 | ||
76 | 84 |
Category.wipe() |
77 | 85 |
cat = Category(name='foobar') |
78 | 86 |
cat.store() |
... | ... | |
107 | 115 |
user = pub.user_class() |
108 | 116 |
user.name = 'User Name' |
109 | 117 |
user.email = 'foo@localhost' |
118 |
user.form_data = {'_phone': '+33123456789'} |
|
110 | 119 |
user.store() |
111 | 120 |
account = PasswordAccount(id='foo') |
112 | 121 |
account.set_password('foo') |
... | ... | |
2065 | 2074 |
resp = app.get('/code/%s/load' % tracking_code, headers={'User-agent': 'Googlebot'}, status=403) |
2066 | 2075 | |
2067 | 2076 | |
2077 |
def test_form_phone_prefill(pub, nocache): |
|
2078 |
create_user(pub) |
|
2079 |
formdef = create_formdef() |
|
2080 |
formdef.data_class().wipe() |
|
2081 |
formdef.fields = [fields.StringField(id='0', label='string', prefill={'type': 'user', 'value': 'phone'})] |
|
2082 |
formdef.store() |
|
2083 | ||
2084 |
resp = login(get_app(pub), username='foo', password='foo').get('/test/') |
|
2085 |
assert resp.pyquery('input#form_f0').val() == '01 23 45 67 89' |
|
2086 |
resp.forms[0]['f0'] = '+33987654321' |
|
2087 |
resp = resp.forms[0].submit('submit') |
|
2088 |
assert resp.pyquery('button.form-submit').val() == 'Submit' |
|
2089 | ||
2090 | ||
2091 |
def test_form_phone_prefill_phone_fr_validation(pub, nocache): |
|
2092 |
create_user(pub) |
|
2093 |
pub.load_site_options() |
|
2094 |
if not pub.site_options.has_section('options'): |
|
2095 |
pub.site_options.add_section('options') |
|
2096 |
pub.site_options.set('options', 'default-country-code', 'FR') |
|
2097 |
with open(os.path.join(pub.app_dir, 'site-options.cfg'), 'w') as fd: |
|
2098 |
pub.site_options.write(fd) |
|
2099 |
formdef = create_formdef() |
|
2100 |
formdef.data_class().wipe() |
|
2101 |
field = fields.StringField(id='0', label='string', prefill={'type': 'user', 'value': 'phone'}) |
|
2102 |
field.validation = {'type': 'phone-fr'} |
|
2103 |
formdef.fields = [field] |
|
2104 |
formdef.store() |
|
2105 | ||
2106 |
resp = login(get_app(pub), username='foo', password='foo').get('/test/') |
|
2107 |
assert resp.pyquery('input#form_f0').val() == '01 23 45 67 89' |
|
2108 |
resp.forms[0]['f0'] = '0987654321' |
|
2109 |
resp = resp.forms[0].submit('submit') |
|
2110 |
assert resp.pyquery('button.form-submit').val() == 'Submit' |
|
2111 | ||
2112 | ||
2113 |
def test_form_phone_prefill_phone_validation(pub, nocache): |
|
2114 |
user = create_user(pub) |
|
2115 |
pub.load_site_options() |
|
2116 |
if not pub.site_options.has_section('options'): |
|
2117 |
pub.site_options.add_section('options') |
|
2118 |
pub.site_options.set('options', 'default-country-code', 'BE') |
|
2119 |
with open(os.path.join(pub.app_dir, 'site-options.cfg'), 'w') as fd: |
|
2120 |
pub.site_options.write(fd) |
|
2121 |
formdef = create_formdef() |
|
2122 |
formdef.data_class().wipe() |
|
2123 |
field = fields.StringField(id='0', label='string', prefill={'type': 'user', 'value': 'phone'}) |
|
2124 |
field.validation = {'type': 'phone'} |
|
2125 |
formdef.fields = [field] |
|
2126 |
formdef.store() |
|
2127 | ||
2128 |
resp = login(get_app(pub), username='foo', password='foo').get('/test/') |
|
2129 |
assert resp.pyquery('input#form_f0').val() == '01 23 45 67 89' |
|
2130 |
resp.forms[0]['f0'] = '0987654321' |
|
2131 |
resp = resp.forms[0].submit('submit') |
|
2132 |
assert resp.pyquery('button.form-submit').val() == 'Submit' |
|
2133 | ||
2134 |
user.form_data['_phone'] = '+3281000000' |
|
2135 |
user.store() |
|
2136 | ||
2137 |
resp = login(get_app(pub), username='foo', password='foo').get('/test/') |
|
2138 |
assert resp.pyquery('input#form_f0').val() == '081 00 00 00' |
|
2139 |
resp.forms[0]['f0'] = '0987654321' |
|
2140 |
resp = resp.forms[0].submit('submit') |
|
2141 |
assert resp.pyquery('button.form-submit').val() == 'Submit' |
|
2142 | ||
2143 |
user.form_data['_phone'] = '+99981000000' |
|
2144 |
user.store() |
|
2145 | ||
2146 |
resp = login(get_app(pub), username='foo', password='foo').get('/test/') |
|
2147 |
assert resp.pyquery('input#form_f0').val() == '+99981000000' |
|
2148 |
resp.forms[0]['f0'] = '0987654321' |
|
2149 |
resp = resp.forms[0].submit('submit') |
|
2150 |
assert resp.pyquery('button.form-submit').val() == 'Submit' |
|
2151 | ||
2152 | ||
2068 | 2153 |
def test_form_tracking_code_prefill(pub, nocache): |
2069 | 2154 |
create_user(pub) |
2070 | 2155 |
formdef = create_formdef() |
... | ... | |
3368 | 3453 |
def test_form_page_profile_first_name_prefill(pub): |
3369 | 3454 |
user = create_user(pub) |
3370 | 3455 | |
3371 |
from wcs.admin.settings import UserFieldsFormDef |
|
3372 | ||
3373 | 3456 |
user_formdef = UserFieldsFormDef(pub) |
3374 | 3457 |
user_formdef.fields = [ |
3375 | 3458 |
fields.StringField( |
... | ... | |
5788 | 5871 |
def test_form_page_profile_verified_date_prefill(pub): |
5789 | 5872 |
user = create_user(pub) |
5790 | 5873 | |
5791 |
from wcs.admin.settings import UserFieldsFormDef |
|
5792 | ||
5793 | 5874 |
user_formdef = UserFieldsFormDef(pub) |
5794 | 5875 |
user_formdef.fields.append(fields.DateField(id='_date', label='date', type='date')) |
5795 | 5876 |
user_formdef.store() |
... | ... | |
5840 | 5921 |
def test_form_page_profile_date_as_locked_string_prefill(pub): |
5841 | 5922 |
user = create_user(pub) |
5842 | 5923 | |
5843 |
from wcs.admin.settings import UserFieldsFormDef |
|
5844 | ||
5845 | 5924 |
user_formdef = UserFieldsFormDef(pub) |
5846 | 5925 |
user_formdef.fields.append(fields.DateField(id='_date', label='date', type='date')) |
5847 | 5926 |
user_formdef.store() |
tests/test_prefill.py | ||
---|---|---|
1 | 1 |
import datetime |
2 |
import os |
|
2 | 3 |
import shutil |
3 | 4 | |
4 | 5 |
import pytest |
... | ... | |
20 | 21 | |
21 | 22 |
req = HTTPRequest(None, {'SCRIPT_NAME': '/', 'SERVER_NAME': 'example.net'}) |
22 | 23 |
pub._set_request(req) |
24 |
pub.cfg['users'] = { |
|
25 |
'field_phone': '_phone', |
|
26 |
} |
|
27 |
pub.write_cfg() |
|
23 | 28 | |
24 | 29 | |
25 | 30 |
@pytest.fixture |
... | ... | |
27 | 32 |
pub.user_class.wipe() |
28 | 33 |
user = pub.user_class(name='user') |
29 | 34 |
user.email = 'test@example.net' |
35 |
user.form_data = {'_phone': '+33123456789'} |
|
30 | 36 |
user.store() |
31 | 37 |
get_request()._user = user |
32 | 38 |
return user |
... | ... | |
66 | 72 |
assert field.get_prefill_value() == ('{{cards|objects:"unknown"|first|get:"foo"}}', False) |
67 | 73 | |
68 | 74 | |
69 |
def test_prefill_user(user): |
|
75 |
def test_prefill_user_email(user):
|
|
70 | 76 |
field = fields.Field() |
71 | 77 |
field.prefill = {'type': 'user', 'value': 'email'} |
72 | 78 |
assert field.get_prefill_value(user=get_request().user) == ('test@example.net', False) |
73 | 79 | |
74 | 80 | |
81 |
def test_prefill_user_phone(user): |
|
82 |
field = fields.Field() |
|
83 |
field.prefill = {'type': 'user', 'value': 'phone'} |
|
84 |
assert field.get_prefill_value(user=get_request().user) == ('01 23 45 67 89', False) |
|
85 | ||
86 | ||
87 |
def test_prefill_user_phone_fr_validation(user): |
|
88 |
pub.load_site_options() |
|
89 |
if not pub.site_options.has_section('options'): |
|
90 |
pub.site_options.add_section('options') |
|
91 |
pub.site_options.set('options', 'default-country-code', 'FR') |
|
92 |
with open(os.path.join(pub.app_dir, 'site-options.cfg'), 'w') as fd: |
|
93 |
pub.site_options.write(fd) |
|
94 |
field = fields.Field() |
|
95 |
field.validation = {'type': 'phone-fr'} |
|
96 |
field.prefill = {'type': 'user', 'value': 'phone'} |
|
97 |
assert field.get_prefill_value(user=get_request().user) == ('01 23 45 67 89', False) |
|
98 | ||
99 | ||
100 |
def test_prefill_user_phone_validation(user): |
|
101 |
pub.load_site_options() |
|
102 |
if not pub.site_options.has_section('options'): |
|
103 |
pub.site_options.add_section('options') |
|
104 |
pub.site_options.set('options', 'default-country-code', 'BE') |
|
105 |
with open(os.path.join(pub.app_dir, 'site-options.cfg'), 'w') as fd: |
|
106 |
pub.site_options.write(fd) |
|
107 |
field = fields.Field() |
|
108 |
field.validation = {'type': 'phone'} |
|
109 |
field.prefill = {'type': 'user', 'value': 'phone'} |
|
110 |
assert field.get_prefill_value(user=get_request().user) == ('01 23 45 67 89', False) |
|
111 | ||
112 |
user = get_request().user |
|
113 |
user.form_data['_phone'] = '+3281000000' |
|
114 |
user.store() |
|
115 | ||
116 |
assert field.get_prefill_value(user=get_request().user) == ('081 00 00 00', False) |
|
117 | ||
118 |
user.form_data['_phone'] = '+99981000000' |
|
119 |
user.store() |
|
120 | ||
121 |
assert field.get_prefill_value(user=get_request().user) == ('+99981000000', False) |
|
122 | ||
123 | ||
75 | 124 |
def test_prefill_user_attribute(user): |
76 | 125 |
from wcs.admin.settings import UserFieldsFormDef |
77 | 126 |
wcs/fields.py | ||
---|---|---|
539 | 539 |
x = self.prefill.get('value') |
540 | 540 |
if x == 'email': |
541 | 541 |
return (user.email, explicit_lock or 'email' in (user.verified_fields or [])) |
542 |
elif x == 'phone': |
|
543 |
country_code = get_publisher().get_site_option('default-country-code') |
|
544 |
if getattr(self, 'validation', None) and self.validation.get('type') == 'phone-fr': |
|
545 |
country_code = 'FR' |
|
546 |
phone = user.get_formatted_phone(country_code=country_code) |
|
547 |
return (phone, explicit_lock or 'phone' in (user.verified_fields or [])) |
|
542 | 548 |
elif user.form_data: |
543 | 549 |
userform = user.get_formdef() |
544 | 550 |
for userfield in userform.fields: |
wcs/users.py | ||
---|---|---|
19 | 19 |
import json |
20 | 20 |
import urllib.parse |
21 | 21 | |
22 |
import phonenumbers |
|
22 | 23 |
from quixote import get_publisher |
23 | 24 | |
24 | 25 |
import wcs.qommon.storage as st |
... | ... | |
85 | 86 |
if changed: |
86 | 87 |
self.store() |
87 | 88 | |
89 |
def get_formatted_phone(self, country_code): |
|
90 |
users_cfg = get_cfg('users', {}) |
|
91 |
phone = self.form_data.get('phone') |
|
92 |
if not phone: |
|
93 |
field_phone = users_cfg.get('field_phone') |
|
94 |
phone = self.form_data.get(field_phone) |
|
95 |
try: |
|
96 |
pn = phonenumbers.parse(phone) |
|
97 |
except phonenumbers.NumberParseException: |
|
98 |
try: |
|
99 |
pn = phonenumbers.parse(phone, country_code) |
|
100 |
except phonenumbers.NumberParseException: |
|
101 |
return phone |
|
102 | ||
103 |
if phonenumbers.is_valid_number(pn): |
|
104 |
return phonenumbers.format_number(pn, phonenumbers.PhoneNumberFormat.NATIONAL) |
|
105 |
else: |
|
106 |
return phone |
|
107 | ||
88 | 108 |
@invalidate_substitution_cache |
89 | 109 |
def store(self, *args, **kwargs): |
90 | 110 |
return super().store(*args, **kwargs) |
91 |
- |