Projet

Général

Profil

0001-general-support-prefilling-with-verified-profile-fie.patch

côté wcs, la prise en charge - Frédéric Péters, 29 juin 2016 10:32

Télécharger (8,4 ko)

Voir les différences:

Subject: [PATCH] general: support prefilling with "verified" profile fields
 (#12366)

 tests/test_form_pages.py | 61 ++++++++++++++++++++++++++++++++++++++++++++++++
 tests/test_prefill.py    | 56 +++++++++++++++++++++++++++++++-------------
 wcs/fields.py            |  8 +++----
 wcs/users.py             |  2 +-
 4 files changed, 106 insertions(+), 21 deletions(-)
tests/test_form_pages.py
1387 1387
    assert 'widget-prefilled' in resp.body
1388 1388
    assert not 'Value has been automatically prefilled.' in resp.body
1389 1389

  
1390
def test_form_page_profile_prefill(pub):
1391
    user = create_user(pub)
1392
    formdef = create_formdef()
1393
    formdef.data_class().wipe()
1394
    formdef.fields = [fields.StringField(id='0', label='string',
1395
        prefill={'type': 'user', 'value': 'email'})]
1396
    formdef.store()
1397

  
1398
    resp = get_app(pub).get('/test/')
1399
    assert resp.forms[0]['f0'].value == ''
1400

  
1401
    resp = login(get_app(pub), username='foo', password='foo').get('/test/')
1402
    assert resp.forms[0]['f0'].value == 'foo@localhost'
1403

  
1390 1404
def test_form_page_formula_prefill(pub):
1391 1405
    user = create_user(pub)
1392 1406
    formdef = create_formdef()
......
2890 2904
    assert resp.headers['Set-Cookie'].startswith('wcs-')
2891 2905
    assert 'httponly' in resp.headers['Set-Cookie']
2892 2906
    assert 'secure' in resp.headers['Set-Cookie']
2907

  
2908
def test_form_page_profile_verified_prefill(pub):
2909
    user = create_user(pub)
2910
    formdef = create_formdef()
2911
    formdef.data_class().wipe()
2912
    formdef.fields = [fields.StringField(id='0', label='string',
2913
        prefill={'type': 'user', 'value': 'email'})]
2914
    formdef.store()
2915

  
2916
    resp = get_app(pub).get('/test/')
2917
    assert resp.form['f0'].value == ''
2918

  
2919
    resp = login(get_app(pub), username='foo', password='foo').get('/test/')
2920
    assert resp.form['f0'].value == 'foo@localhost'
2921
    assert not 'readonly' in resp.form['f0'].attrs
2922
    resp.form['f0'].value = 'Hello'
2923
    resp = resp.form.submit('submit')
2924
    assert 'Check values then click submit.' in resp.body
2925
    assert resp.form['f0'].value == 'Hello'
2926

  
2927
    user.verified_fields = ['email']
2928
    user.store()
2929

  
2930
    resp = login(get_app(pub), username='foo', password='foo').get('/test/')
2931
    assert resp.form['f0'].value == 'foo@localhost'
2932
    assert 'readonly' in resp.form['f0'].attrs
2933

  
2934
    resp.form['f0'].value = 'Hello' # try changing the value
2935
    resp = resp.form.submit('submit')
2936
    assert 'Check values then click submit.' in resp.body
2937
    assert resp.form['f0'].value == 'foo@localhost'  # it is reverted
2938

  
2939
    resp.form['f0'].value = 'Hello' # try again changing the value
2940
    resp = resp.form.submit('submit')
2941

  
2942
    assert formdef.data_class().count() == 1
2943
    assert formdef.data_class().select()[0].data['0'] == 'foo@localhost'
2944

  
2945
    resp = login(get_app(pub), username='foo', password='foo').get('/test/')
2946
    assert resp.form['f0'].value == 'foo@localhost'
2947
    resp = resp.form.submit('submit')
2948
    assert 'Check values then click submit.' in resp.body
2949
    resp.form['f0'].value = 'Hello' # try changing
2950
    resp = resp.form.submit('previous')
2951
    assert 'readonly' in resp.form['f0'].attrs
2952
    assert not 'Check values then click submit.' in resp.body
2953
    assert resp.form['f0'].value == 'foo@localhost'
tests/test_prefill.py
1 1
import sys
2 2
import shutil
3 3

  
4
import pytest
5

  
4 6
from quixote import cleanup, get_request
5 7
from wcs.qommon.http_request import HTTPRequest
6 8
from wcs import fields
......
17 19
    req = HTTPRequest(None, {})
18 20
    pub._set_request(req)
19 21

  
22
@pytest.fixture
23
def user(request):
24
    pub.user_class.wipe()
20 25
    user = pub.user_class(name='user')
21 26
    user.id = 'user'
22 27
    user.email = 'test@example.net'
23

  
24
    req._user = user
25

  
28
    get_request()._user = user
29
    return user
26 30

  
27 31
def teardown_module(module):
28 32
    shutil.rmtree(pub.APP_DIR)
......
31 35
def test_prefill_string():
32 36
    field = fields.Field()
33 37
    field.prefill = {'type': 'string', 'value': 'test'}
38
    assert field.get_prefill_value() == ('test', False)
34 39

  
35
    assert field.get_prefill_value() == 'test'
40
def test_prefill_user(user):
41
    field = fields.Field()
42
    field.prefill = {'type': 'user', 'value': 'email'}
43
    assert field.get_prefill_value(user=get_request().user) == ('test@example.net', False)
36 44

  
45
def test_prefill_user_attribute(user):
46
    from wcs.admin.settings import UserFieldsFormDef
47
    formdef = UserFieldsFormDef(pub)
48
    formdef.fields = [fields.StringField(id='3', label='test', type='string', varname='plop')]
49
    formdef.store()
37 50

  
38
def test_prefill_user():
39 51
    field = fields.Field()
40
    field.prefill = {'type': 'user', 'value': 'email'}
52
    field.prefill = {'type': 'user', 'value': '3'}
53
    assert field.get_prefill_value(user=get_request().user) == (None, False)
41 54

  
42
    assert field.get_prefill_value(user=get_request().user) == 'test@example.net'
55
    user.form_data = {'3': 'Plop'}
56
    user.store()
57
    assert field.get_prefill_value(user=get_request().user) == ('Plop', False)
43 58

  
59
def test_prefill_verified_user_attribute(user):
60
    from wcs.admin.settings import UserFieldsFormDef
61
    formdef = UserFieldsFormDef(pub)
62
    formdef.fields = [fields.StringField(id='3', label='test', type='string', varname='plop')]
63
    formdef.store()
44 64

  
45
def test_prefill_formula():
46 65
    field = fields.Field()
47
    field.prefill = {'type': 'formula', 'value': 'str(2+5)'}
66
    field.prefill = {'type': 'user', 'value': '3'}
67
    assert field.get_prefill_value(user=get_request().user) == (None, False)
48 68

  
49
    assert field.get_prefill_value() == '7'
69
    user.form_data = {'3': 'Plop'}
70
    user.verified_fields = ['3']
71
    user.store()
72
    assert field.get_prefill_value(user=get_request().user) == ('Plop', True)
50 73

  
74
def test_prefill_formula():
75
    field = fields.Field()
76
    field.prefill = {'type': 'formula', 'value': 'str(2+5)'}
77
    assert field.get_prefill_value() == ('7', False)
51 78

  
52 79
def test_prefill_formula_with_error():
53 80
    field = fields.Field()
54 81
    field.prefill = {'type': 'formula', 'value': 'foobar'}
82
    assert field.get_prefill_value() == (None, False)
55 83

  
56
    assert field.get_prefill_value() is None
57

  
58

  
59
def test_prefill_formula_substition_variable():
84
def test_prefill_formula_substitution_variable():
60 85
    pub.substitutions.get_context_variables = lambda: {'test': 'value'}
61 86
    field = fields.Field()
62 87
    field.prefill = {'type': 'formula', 'value': 'test'}
63

  
64
    assert field.get_prefill_value() == 'value'
88
    assert field.get_prefill_value() == ('value', False)
wcs/fields.py
281 281
        elif t == 'user' and user:
282 282
            x = self.prefill.get('value')
283 283
            if x == 'email':
284
                return (user.email, False)
284
                return (user.email, 'email' in (user.verified_fields or []))
285 285
            elif user.form_data:
286 286
                userform = user.get_formdef()
287 287
                for userfield in userform.fields:
288 288
                    if userfield.id == x:
289 289
                        return (user.form_data.get(x),
290
                                str(userfield.id) in user.verified_fields or [])
290
                                str(userfield.id) in (user.verified_fields or []))
291 291

  
292 292
        elif t == 'formula':
293 293
            formula = self.prefill.get('value')
......
301 301
                pass
302 302

  
303 303
        elif t == 'geolocation':
304
            return (None, None)
304
            return (None, False)
305 305

  
306
        return (None, None)
306
        return (None, False)
307 307

  
308 308
    def get_prefill_attributes(self):
309 309
        t = self.prefill.get('type')
wcs/users.py
33 33
    anonymous = False
34 34
    form_data = None  # dumping ground for custom fields
35 35

  
36
    certified_fields = None
36
    verified_fields = None
37 37
    name_identifiers = None
38 38
    lasso_dump = None
39 39

  
40
-