0004-attribute_kinds-use-custom-PhoneField-for-phone_numb.patch
src/authentic2/attribute_kinds.py | ||
---|---|---|
161 | 161 |
return cleaned_number |
162 | 162 | |
163 | 163 | |
164 |
class PhoneNumberField(forms.CharField): |
|
165 |
widget = widgets.PhoneNumberInput |
|
166 | ||
167 |
def __init__(self, *args, **kwargs): |
|
168 |
kwargs['max_length'] = 30 |
|
169 |
kwargs.setdefault('help_text', _('ex.: 0699999999, +33 6 99 99 99 99')) |
|
170 |
super().__init__(*args, **kwargs) |
|
171 | ||
172 |
def clean(self, value): |
|
173 |
if value not in self.empty_values: |
|
174 |
value = clean_number(value) |
|
175 |
return value |
|
176 | ||
177 | ||
178 | 164 |
class FrenchPhoneNumberField(forms.CharField): |
179 | 165 |
widget = widgets.PhoneNumberInput |
180 | 166 | |
... | ... | |
362 | 348 |
{ |
363 | 349 |
'label': _('phone number'), |
364 | 350 |
'name': 'phone_number', |
365 |
'field_class': PhoneNumberField,
|
|
351 |
'field_class': fields.PhoneField,
|
|
366 | 352 |
'rest_framework_field_class': PhoneNumberDRFField, |
367 | 353 |
}, |
368 | 354 |
{ |
tests/test_attribute_kinds.py | ||
---|---|---|
199 | 199 |
return get_link_from_mail(mailoutbox[-1]) |
200 | 200 | |
201 | 201 |
Attribute.objects.create( |
202 |
name='phone_number', label='phone', kind='phone_number', asked_on_registration=True
|
|
202 |
name='phone_number', label='Second Phone', kind='phone_number', asked_on_registration=True
|
|
203 | 203 |
) |
204 | 204 |
qs = User.objects.filter(first_name='John') |
205 | 205 | |
... | ... | |
208 | 208 |
form = response.form |
209 | 209 |
form.set('first_name', 'John') |
210 | 210 |
form.set('last_name', 'Doe') |
211 |
form.set('phone_number', 'abc') |
|
211 |
form.set('phone_number_0', '33') |
|
212 |
form.set('phone_number_1', 'abc') |
|
212 | 213 |
form.set('password1', '12345abcdA') |
213 | 214 |
form.set('password2', '12345abcdA') |
214 | 215 |
response = form.submit() |
215 |
assert response.pyquery.find('.form-field-error #id_phone_number') |
|
216 |
assert response.pyquery.find('.form-field-error #id_phone_number_0')
|
|
216 | 217 | |
217 | 218 |
form = response.form |
218 |
assert response.pyquery('#id_phone_number').attr('maxlength') == '30' |
|
219 |
form.set('phone_number', '1234512345' * 10) |
|
219 |
assert not response.pyquery('#id_phone_number_1').attr('maxlength') |
|
220 |
form.set('phone_number_0', '33') |
|
221 |
form.set('phone_number_1', '1234512345' * 10) |
|
220 | 222 |
form.set('password1', '12345abcdA') |
221 | 223 |
form.set('password2', '12345abcdA') |
222 | 224 |
response = form.submit() |
223 |
assert response.pyquery.find('.form-field-error #id_phone_number') |
|
225 |
assert response.pyquery.find('.form-field-error #id_phone_number_0')
|
|
224 | 226 | |
225 | 227 |
form = response.form |
226 |
form.set('phone_number', '12345') |
|
228 |
form.set('phone_number_0', '33') |
|
229 |
form.set('phone_number_1', ' + 1.2-3 4 5 ') |
|
230 |
form.set('password1', '12345abcdA') |
|
231 |
form.set('password2', '12345abcdA') |
|
232 |
response = form.submit() |
|
233 |
assert response.pyquery.find('.form-field-error #id_phone_number_0') |
|
234 | ||
235 |
form = response.form |
|
236 |
form.set('phone_number_0', '33') |
|
237 |
form.set('phone_number_1', '12345') |
|
227 | 238 |
form.set('password1', '12345abcdA') |
228 | 239 |
form.set('password2', '12345abcdA') |
229 | 240 |
response = form.submit().follow() |
230 |
assert qs.get().attributes.phone_number == '12345' |
|
241 |
assert qs.get().attributes.phone_number == '+3312345'
|
|
231 | 242 |
qs.delete() |
232 | 243 | |
233 | 244 |
url = register_john() |
... | ... | |
235 | 246 |
form = response.form |
236 | 247 |
form.set('first_name', 'John') |
237 | 248 |
form.set('last_name', 'Doe') |
238 |
form.set('phone_number', '+12345') |
|
249 |
form.set('phone_number_0', '32') |
|
250 |
form.set('phone_number_1', '12345') |
|
239 | 251 |
form.set('password1', '12345abcdA') |
240 | 252 |
form.set('password2', '12345abcdA') |
241 | 253 |
response = form.submit().follow() |
242 |
assert qs.get().attributes.phone_number == '+12345' |
|
254 |
assert qs.get().attributes.phone_number == '+3212345'
|
|
243 | 255 |
qs.delete() |
244 | 256 | |
245 | 257 |
url = register_john() |
... | ... | |
247 | 259 |
form = response.form |
248 | 260 |
form.set('first_name', 'John') |
249 | 261 |
form.set('last_name', 'Doe') |
250 |
form.set('phone_number', '') |
|
262 |
form.set('phone_number_0', '33') |
|
263 |
form.set('phone_number_1', '') |
|
251 | 264 |
form.set('password1', '12345abcdA') |
252 | 265 |
form.set('password2', '12345abcdA') |
253 | 266 |
response = form.submit().follow() |
... | ... | |
259 | 272 |
form = response.form |
260 | 273 |
form.set('first_name', 'John') |
261 | 274 |
form.set('last_name', 'Doe') |
262 |
form.set('phone_number', ' + 1.2-3 4 5 ') |
|
275 |
form.set('phone_number_0', '33') |
|
276 |
form.set('phone_number_1', '1 2 3 4 5') |
|
263 | 277 |
form.set('password1', '12345abcdA') |
264 | 278 |
form.set('password2', '12345abcdA') |
265 | 279 |
response = form.submit().follow() |
266 |
assert qs.get().attributes.phone_number == '+12345' |
|
280 |
assert qs.get().attributes.phone_number == '+3312345'
|
|
267 | 281 |
qs.delete() |
268 | 282 | |
269 | 283 |
tests/test_csv_import.py | ||
---|---|---|
211 | 211 |
assert all(error == Error('data-error') for error in importer.rows[2].cells[0].errors) |
212 | 212 |
assert not importer.rows[2].cells[1].errors |
213 | 213 |
assert not importer.rows[2].cells[2].errors |
214 |
assert importer.rows[2].cells[3].errors |
|
214 |
assert not importer.rows[2].cells[3].errors
|
|
215 | 215 |
assert all(error == Error('data-error') for error in importer.rows[2].cells[3].errors) |
216 | 216 | |
217 | 217 |
assert importer.updated == 0 |
tests/test_profile.py | ||
---|---|---|
46 | 46 |
) |
47 | 47 | |
48 | 48 |
resp = old_resp = app.get(url, status=200) |
49 |
resp.form['phone'] = '1234' |
|
50 |
assert resp.form['phone'].attrs['type'] == 'tel'
|
|
49 |
resp.form['phone_1'] = '1234'
|
|
50 |
assert resp.form['phone_1'].attrs['type'] == 'text'
|
|
51 | 51 |
resp.form['title'] = 'Mrs' |
52 | 52 |
resp.form['agreement'] = False |
53 | 53 |
assert resp.form['language'].tag == 'select' |
... | ... | |
56 | 56 |
resp = resp.form.submit() |
57 | 57 |
# verify that missing next_url in POST is ok |
58 | 58 |
assert resp['Location'].endswith(reverse('account_management')) |
59 |
assert phone.get_value(simple_user) == '1234' |
|
59 |
assert phone.get_value(simple_user) == '+331234'
|
|
60 | 60 |
assert title.get_value(simple_user) == 'Mrs' |
61 | 61 |
assert agreement.get_value(simple_user) is False |
62 | 62 |
assert language.get_value(simple_user) == 'fr' |
... | ... | |
70 | 70 |
('First name', 'Jôhn'), |
71 | 71 |
('Last name', 'Dôe'), |
72 | 72 |
('Email address', 'user@example.net'), |
73 |
('Phone', '1234'), |
|
73 |
('Phone', '+331234'),
|
|
74 | 74 |
('Title', 'Mrs'), |
75 | 75 |
('Language', 'French'), |
76 | 76 |
] |
77 | 77 | |
78 | 78 |
resp = app.get(url, status=200) |
79 |
resp.form.set('phone', '0123456789') |
|
79 |
resp.form.set('phone_1', '0123456789')
|
|
80 | 80 |
resp = resp.form.submit().follow() |
81 |
assert phone.get_value(simple_user) == '0123456789'
|
|
81 |
assert phone.get_value(simple_user) == '+33123456789'
|
|
82 | 82 | |
83 | 83 |
resp = app.get(url, status=200) |
84 |
resp.form.set('phone', '9876543210') |
|
84 |
resp.form.set('phone_1', '9876543210')
|
|
85 | 85 |
resp = resp.form.submit('cancel').follow() |
86 |
assert phone.get_value(simple_user) == '0123456789'
|
|
86 |
assert phone.get_value(simple_user) == '+33123456789'
|
|
87 | 87 | |
88 |
phone.set_value(simple_user, '0123456789', verified=True)
|
|
88 |
phone.set_value(simple_user, '+33123456789', verified=True)
|
|
89 | 89 |
title.set_value(simple_user, 'Mr', verified=True) |
90 | 90 |
agreement.set_value(simple_user, True, verified=True) |
91 | 91 |
resp = app.get(url, status=200) |
... | ... | |
93 | 93 |
assert 'title' not in resp.form.fields |
94 | 94 |
assert 'agreement' not in resp.form.fields |
95 | 95 |
assert 'readonly' in resp.form['phone@disabled'].attrs |
96 |
assert resp.form['phone@disabled'].value == '0123456789'
|
|
96 |
assert resp.form['phone@disabled'].value == '+33123456789'
|
|
97 | 97 |
assert resp.form['title@disabled'].value == 'Mr' |
98 | 98 |
assert resp.form['agreement@disabled'].value == 'Yes' |
99 | 99 |
resp.form.set('phone@disabled', '1234') |
100 | 100 |
resp.form.set('title@disabled', 'Mrs') |
101 | 101 |
resp.form.set('agreement@disabled', 'False') |
102 | 102 |
resp = resp.form.submit().follow() |
103 |
assert phone.get_value(simple_user) == '0123456789'
|
|
103 |
assert phone.get_value(simple_user) == '+33123456789'
|
|
104 | 104 |
assert title.get_value(simple_user) == 'Mr' |
105 | 105 |
assert agreement.get_value(simple_user) is True |
106 | 106 | |
107 | 107 |
resp = old_resp.form.submit() |
108 |
assert phone.get_value(simple_user) == '0123456789'
|
|
108 |
assert phone.get_value(simple_user) == '+33123456789'
|
|
109 | 109 |
assert title.get_value(simple_user) == 'Mr' |
110 | 110 |
assert agreement.get_value(simple_user) is True |
111 | 111 | |
... | ... | |
115 | 115 |
assert 'phone@disabled' not in resp |
116 | 116 |
assert 'title@disabled' in resp |
117 | 117 |
assert 'agreement@disabled' in resp |
118 |
assert phone.get_value(simple_user) == '0123456789'
|
|
118 |
assert phone.get_value(simple_user) == '+33123456789'
|
|
119 | 119 | |
120 | 120 | |
121 | 121 |
def test_account_edit_next_url(app, simple_user, external_redirect_next_url, assert_external_redirect): |
tests/test_views.py | ||
---|---|---|
25 | 25 | |
26 | 26 |
from authentic2.custom_user.models import DeletedUser, User |
27 | 27 |
from authentic2.forms.passwords import PasswordChangeForm, SetPasswordForm |
28 |
from authentic2.models import Attribute |
|
28 | 29 | |
29 | 30 |
from .utils import assert_event, get_link_from_mail, login, logout |
30 | 31 | |
... | ... | |
37 | 38 |
assert simple_user.last_name in page |
38 | 39 | |
39 | 40 | |
41 |
def test_phone_number_change_invalid_number(settings, app, simple_user): |
|
42 |
settings.A2_PROFILE_FIELDS = ('phone', 'mobile') |
|
43 | ||
44 |
Attribute.objects.create( |
|
45 |
kind='phone_number', |
|
46 |
name='mobile', |
|
47 |
label='Mobile', |
|
48 |
user_visible=True, |
|
49 |
user_editable=True, |
|
50 |
) |
|
51 | ||
52 |
simple_user.attributes.mobile = 'def' # invalid number |
|
53 |
resp = login(app, simple_user, path='/accounts/edit/') |
|
54 | ||
55 |
assert resp.pyquery('input#id_mobile_1')[0].value == 'def' |
|
56 | ||
57 |
resp = resp.form.submit() |
|
58 |
assert ( |
|
59 |
'Phone number can start with a + and must contain only digits.' in resp.pyquery('div.error')[0].text |
|
60 |
) |
|
61 | ||
62 |
resp.form['mobile_1'] = '612345678' |
|
63 |
resp.form.submit().follow() |
|
64 |
simple_user.refresh_from_db() |
|
65 | ||
66 |
assert simple_user.attributes.mobile == '+33612345678' |
|
67 | ||
68 | ||
40 | 69 |
def test_password_change(app, simple_user): |
41 | 70 |
simple_user.set_password('hop') |
42 | 71 |
simple_user.save() |
43 |
- |