Projet

Général

Profil

0001-attribute_kinds-use-custom-PhoneField-for-phone_numb.patch

Paul Marillonnet, 22 septembre 2022 11:36

Télécharger (10,6 ko)

Voir les différences:

Subject: [PATCH 1/3] attribute_kinds: use custom PhoneField for phone_number
 type (#69365)

 src/authentic2/attribute_kinds.py | 16 +------------
 tests/test_attribute_kinds.py     | 40 +++++++++++++++++++++----------
 tests/test_csv_import.py          |  2 +-
 tests/test_fields.py              | 17 +++++++++----
 tests/test_profile.py             | 26 ++++++++++----------
 5 files changed, 55 insertions(+), 46 deletions(-)
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
-