0001-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 | |
... | ... | |
360 | 346 |
{ |
361 | 347 |
'label': _('phone number'), |
362 | 348 |
'name': 'phone_number', |
363 |
'field_class': PhoneNumberField,
|
|
349 |
'field_class': fields.PhoneField,
|
|
364 | 350 |
'rest_framework_field_class': PhoneNumberDRFField, |
365 | 351 |
}, |
366 | 352 |
{ |
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_fields.py | ||
---|---|---|
18 | 18 |
import pytest |
19 | 19 |
from django.core.exceptions import ValidationError |
20 | 20 | |
21 |
from authentic2.attribute_kinds import PhoneNumberField
|
|
21 |
from authentic2.forms.fields import PhoneField
|
|
22 | 22 | |
23 | 23 | |
24 | 24 |
def test_phonenumber_field(): |
25 |
field = PhoneNumberField()
|
|
25 |
field = PhoneField() |
|
26 | 26 | |
27 | 27 |
# positive |
28 |
for value in ['01 01 01 01 01', '+01 01 01 01 01', ' + 01/01.01-01.01', '+01/01.01-01.01']: |
|
28 |
for value in [ |
|
29 |
['33', '01 01 01 01 01'], |
|
30 |
['33', '01a01'], |
|
31 |
['33', '01 01 01'], |
|
32 |
['33', '01 01 01 010101'], |
|
33 |
]: |
|
29 | 34 |
field.clean(value) |
30 | 35 | |
31 | 36 |
# negative |
32 |
for value in ['01a01']: |
|
37 |
for value in [ |
|
38 |
['33', '+01 01 01 01 01'], |
|
39 |
['33', ' + 01/01.01-01.01'], |
|
40 |
['33', '+01/01.01-01.01'], |
|
41 |
]: |
|
33 | 42 |
with pytest.raises(ValidationError): |
34 | 43 |
field.clean(value) |
tests/test_profile.py | ||
---|---|---|
43 | 43 |
) |
44 | 44 | |
45 | 45 |
resp = old_resp = app.get(url, status=200) |
46 |
resp.form['phone'] = '1234' |
|
47 |
assert resp.form['phone'].attrs['type'] == 'tel'
|
|
46 |
resp.form['phone_1'] = '1234'
|
|
47 |
assert resp.form['phone_1'].attrs['type'] == 'text'
|
|
48 | 48 |
resp.form['title'] = 'Mrs' |
49 | 49 |
resp.form['agreement'] = False |
50 | 50 |
resp = resp.form.submit() |
51 | 51 |
# verify that missing next_url in POST is ok |
52 | 52 |
assert resp['Location'].endswith(reverse('account_management')) |
53 |
assert phone.get_value(simple_user) == '1234' |
|
53 |
assert phone.get_value(simple_user) == '+331234'
|
|
54 | 54 |
assert title.get_value(simple_user) == 'Mrs' |
55 | 55 |
assert agreement.get_value(simple_user) is False |
56 | 56 | |
... | ... | |
63 | 63 |
('First name', 'Jôhn'), |
64 | 64 |
('Last name', 'Dôe'), |
65 | 65 |
('Email address', 'user@example.net'), |
66 |
('Phone', '1234'), |
|
66 |
('Phone', '+331234'),
|
|
67 | 67 |
('Title', 'Mrs'), |
68 | 68 |
] |
69 | 69 | |
70 | 70 |
resp = app.get(url, status=200) |
71 |
resp.form.set('phone', '0123456789') |
|
71 |
resp.form.set('phone_1', '0123456789')
|
|
72 | 72 |
resp = resp.form.submit().follow() |
73 |
assert phone.get_value(simple_user) == '0123456789'
|
|
73 |
assert phone.get_value(simple_user) == '+33123456789'
|
|
74 | 74 | |
75 | 75 |
resp = app.get(url, status=200) |
76 |
resp.form.set('phone', '9876543210') |
|
76 |
resp.form.set('phone_1', '9876543210')
|
|
77 | 77 |
resp = resp.form.submit('cancel').follow() |
78 |
assert phone.get_value(simple_user) == '0123456789'
|
|
78 |
assert phone.get_value(simple_user) == '+33123456789'
|
|
79 | 79 | |
80 |
phone.set_value(simple_user, '0123456789', verified=True)
|
|
80 |
phone.set_value(simple_user, '+33123456789', verified=True)
|
|
81 | 81 |
title.set_value(simple_user, 'Mr', verified=True) |
82 | 82 |
agreement.set_value(simple_user, True, verified=True) |
83 | 83 |
resp = app.get(url, status=200) |
... | ... | |
85 | 85 |
assert 'title' not in resp.form.fields |
86 | 86 |
assert 'agreement' not in resp.form.fields |
87 | 87 |
assert 'readonly' in resp.form['phone@disabled'].attrs |
88 |
assert resp.form['phone@disabled'].value == '0123456789'
|
|
88 |
assert resp.form['phone@disabled'].value == '+33123456789'
|
|
89 | 89 |
assert resp.form['title@disabled'].value == 'Mr' |
90 | 90 |
assert resp.form['agreement@disabled'].value == 'Yes' |
91 | 91 |
resp.form.set('phone@disabled', '1234') |
92 | 92 |
resp.form.set('title@disabled', 'Mrs') |
93 | 93 |
resp.form.set('agreement@disabled', 'False') |
94 | 94 |
resp = resp.form.submit().follow() |
95 |
assert phone.get_value(simple_user) == '0123456789'
|
|
95 |
assert phone.get_value(simple_user) == '+33123456789'
|
|
96 | 96 |
assert title.get_value(simple_user) == 'Mr' |
97 | 97 |
assert agreement.get_value(simple_user) is True |
98 | 98 | |
99 | 99 |
resp = old_resp.form.submit() |
100 |
assert phone.get_value(simple_user) == '0123456789'
|
|
100 |
assert phone.get_value(simple_user) == '+33123456789'
|
|
101 | 101 |
assert title.get_value(simple_user) == 'Mr' |
102 | 102 |
assert agreement.get_value(simple_user) is True |
103 | 103 | |
... | ... | |
107 | 107 |
assert 'phone@disabled' not in resp |
108 | 108 |
assert 'title@disabled' in resp |
109 | 109 |
assert 'agreement@disabled' in resp |
110 |
assert phone.get_value(simple_user) == '0123456789'
|
|
110 |
assert phone.get_value(simple_user) == '+33123456789'
|
|
111 | 111 | |
112 | 112 | |
113 | 113 |
def test_account_edit_next_url(app, simple_user, external_redirect_next_url, assert_external_redirect): |
114 |
- |