Projet

Général

Profil

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

Paul Marillonnet, 24 novembre 2022 10:04

Télécharger (11,2 ko)

Voir les différences:

Subject: [PATCH 4/5] 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_profile.py             | 26 ++++++++++----------
 tests/test_views.py               | 29 ++++++++++++++++++++++
 5 files changed, 71 insertions(+), 42 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

  
......
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
-