Projet

Général

Profil

0003-fields-prefill-users-phone-number-value-69838.patch

Paul Marillonnet, 29 novembre 2022 10:05

Télécharger (11,1 ko)

Voir les différences:

Subject: [PATCH 3/4] fields: prefill users' phone number value (#69838)

 tests/form_pages/test_all.py | 91 +++++++++++++++++++++++++++++++++---
 tests/test_prefill.py        | 51 +++++++++++++++++++-
 wcs/fields.py                |  6 +++
 wcs/users.py                 | 20 ++++++++
 4 files changed, 161 insertions(+), 7 deletions(-)
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
536 536
            x = self.prefill.get('value')
537 537
            if x == 'email':
538 538
                return (user.email, explicit_lock or 'email' in (user.verified_fields or []))
539
            elif x == 'phone':
540
                country_code = get_publisher().get_site_option('default-country-code')
541
                if getattr(self, 'validation', None) and self.validation.get('type') == 'phone-fr':
542
                    country_code = 'FR'
543
                phone = user.get_formatted_phone(country_code=country_code)
544
                return (phone, explicit_lock or 'phone' in (user.verified_fields or []))
539 545
            elif user.form_data:
540 546
                userform = user.get_formdef()
541 547
                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
......
65 66
        self.verified_fields = []
66 67
        self.roles = []
67 68

  
69
    def get_formatted_phone(self, country_code):
70
        users_cfg = get_cfg('users', {})
71
        field_phone = users_cfg.get('field_phone')
72
        if not field_phone:
73
            return
74
        phone = self.form_data.get(field_phone)
75
        try:
76
            pn = phonenumbers.parse(phone)
77
        except phonenumbers.NumberParseException:
78
            try:
79
                pn = phonenumbers.parse(phone, country_code)
80
            except phonenumbers.NumberParseException:
81
                return phone
82

  
83
        if phonenumbers.is_valid_number(pn):
84
            return phonenumbers.format_number(pn, phonenumbers.PhoneNumberFormat.NATIONAL)
85
        else:
86
            return phone
87

  
68 88
    @invalidate_substitution_cache
69 89
    def store(self, *args, **kwargs):
70 90
        return super().store(*args, **kwargs)
71
-