From 6741765d7c748db325b790c495c80705b556f940 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Fr=C3=A9d=C3=A9ric=20P=C3=A9ters?= Date: Wed, 29 Jun 2016 10:27:58 +0200 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(-) diff --git a/tests/test_form_pages.py b/tests/test_form_pages.py index fa90df1..1dfdae5 100644 --- a/tests/test_form_pages.py +++ b/tests/test_form_pages.py @@ -1387,6 +1387,20 @@ def test_form_page_string_prefill(pub): assert 'widget-prefilled' in resp.body assert not 'Value has been automatically prefilled.' in resp.body +def test_form_page_profile_prefill(pub): + user = create_user(pub) + formdef = create_formdef() + formdef.data_class().wipe() + formdef.fields = [fields.StringField(id='0', label='string', + prefill={'type': 'user', 'value': 'email'})] + formdef.store() + + resp = get_app(pub).get('/test/') + assert resp.forms[0]['f0'].value == '' + + resp = login(get_app(pub), username='foo', password='foo').get('/test/') + assert resp.forms[0]['f0'].value == 'foo@localhost' + def test_form_page_formula_prefill(pub): user = create_user(pub) formdef = create_formdef() @@ -2890,3 +2904,50 @@ def test_session_cookie_flags(pub): assert resp.headers['Set-Cookie'].startswith('wcs-') assert 'httponly' in resp.headers['Set-Cookie'] assert 'secure' in resp.headers['Set-Cookie'] + +def test_form_page_profile_verified_prefill(pub): + user = create_user(pub) + formdef = create_formdef() + formdef.data_class().wipe() + formdef.fields = [fields.StringField(id='0', label='string', + prefill={'type': 'user', 'value': 'email'})] + formdef.store() + + resp = get_app(pub).get('/test/') + assert resp.form['f0'].value == '' + + resp = login(get_app(pub), username='foo', password='foo').get('/test/') + assert resp.form['f0'].value == 'foo@localhost' + assert not 'readonly' in resp.form['f0'].attrs + resp.form['f0'].value = 'Hello' + resp = resp.form.submit('submit') + assert 'Check values then click submit.' in resp.body + assert resp.form['f0'].value == 'Hello' + + user.verified_fields = ['email'] + user.store() + + resp = login(get_app(pub), username='foo', password='foo').get('/test/') + assert resp.form['f0'].value == 'foo@localhost' + assert 'readonly' in resp.form['f0'].attrs + + resp.form['f0'].value = 'Hello' # try changing the value + resp = resp.form.submit('submit') + assert 'Check values then click submit.' in resp.body + assert resp.form['f0'].value == 'foo@localhost' # it is reverted + + resp.form['f0'].value = 'Hello' # try again changing the value + resp = resp.form.submit('submit') + + assert formdef.data_class().count() == 1 + assert formdef.data_class().select()[0].data['0'] == 'foo@localhost' + + resp = login(get_app(pub), username='foo', password='foo').get('/test/') + assert resp.form['f0'].value == 'foo@localhost' + resp = resp.form.submit('submit') + assert 'Check values then click submit.' in resp.body + resp.form['f0'].value = 'Hello' # try changing + resp = resp.form.submit('previous') + assert 'readonly' in resp.form['f0'].attrs + assert not 'Check values then click submit.' in resp.body + assert resp.form['f0'].value == 'foo@localhost' diff --git a/tests/test_prefill.py b/tests/test_prefill.py index aaa5a81..c0c720a 100644 --- a/tests/test_prefill.py +++ b/tests/test_prefill.py @@ -1,6 +1,8 @@ import sys import shutil +import pytest + from quixote import cleanup, get_request from wcs.qommon.http_request import HTTPRequest from wcs import fields @@ -17,12 +19,14 @@ def setup_module(module): req = HTTPRequest(None, {}) pub._set_request(req) +@pytest.fixture +def user(request): + pub.user_class.wipe() user = pub.user_class(name='user') user.id = 'user' user.email = 'test@example.net' - - req._user = user - + get_request()._user = user + return user def teardown_module(module): shutil.rmtree(pub.APP_DIR) @@ -31,34 +35,54 @@ def teardown_module(module): def test_prefill_string(): field = fields.Field() field.prefill = {'type': 'string', 'value': 'test'} + assert field.get_prefill_value() == ('test', False) - assert field.get_prefill_value() == 'test' +def test_prefill_user(user): + field = fields.Field() + field.prefill = {'type': 'user', 'value': 'email'} + assert field.get_prefill_value(user=get_request().user) == ('test@example.net', False) +def test_prefill_user_attribute(user): + from wcs.admin.settings import UserFieldsFormDef + formdef = UserFieldsFormDef(pub) + formdef.fields = [fields.StringField(id='3', label='test', type='string', varname='plop')] + formdef.store() -def test_prefill_user(): field = fields.Field() - field.prefill = {'type': 'user', 'value': 'email'} + field.prefill = {'type': 'user', 'value': '3'} + assert field.get_prefill_value(user=get_request().user) == (None, False) - assert field.get_prefill_value(user=get_request().user) == 'test@example.net' + user.form_data = {'3': 'Plop'} + user.store() + assert field.get_prefill_value(user=get_request().user) == ('Plop', False) +def test_prefill_verified_user_attribute(user): + from wcs.admin.settings import UserFieldsFormDef + formdef = UserFieldsFormDef(pub) + formdef.fields = [fields.StringField(id='3', label='test', type='string', varname='plop')] + formdef.store() -def test_prefill_formula(): field = fields.Field() - field.prefill = {'type': 'formula', 'value': 'str(2+5)'} + field.prefill = {'type': 'user', 'value': '3'} + assert field.get_prefill_value(user=get_request().user) == (None, False) - assert field.get_prefill_value() == '7' + user.form_data = {'3': 'Plop'} + user.verified_fields = ['3'] + user.store() + assert field.get_prefill_value(user=get_request().user) == ('Plop', True) +def test_prefill_formula(): + field = fields.Field() + field.prefill = {'type': 'formula', 'value': 'str(2+5)'} + assert field.get_prefill_value() == ('7', False) def test_prefill_formula_with_error(): field = fields.Field() field.prefill = {'type': 'formula', 'value': 'foobar'} + assert field.get_prefill_value() == (None, False) - assert field.get_prefill_value() is None - - -def test_prefill_formula_substition_variable(): +def test_prefill_formula_substitution_variable(): pub.substitutions.get_context_variables = lambda: {'test': 'value'} field = fields.Field() field.prefill = {'type': 'formula', 'value': 'test'} - - assert field.get_prefill_value() == 'value' + assert field.get_prefill_value() == ('value', False) diff --git a/wcs/fields.py b/wcs/fields.py index 7d674bb..b66bcf4 100644 --- a/wcs/fields.py +++ b/wcs/fields.py @@ -281,13 +281,13 @@ class Field(object): elif t == 'user' and user: x = self.prefill.get('value') if x == 'email': - return (user.email, False) + return (user.email, 'email' in (user.verified_fields or [])) elif user.form_data: userform = user.get_formdef() for userfield in userform.fields: if userfield.id == x: return (user.form_data.get(x), - str(userfield.id) in user.verified_fields or []) + str(userfield.id) in (user.verified_fields or [])) elif t == 'formula': formula = self.prefill.get('value') @@ -301,9 +301,9 @@ class Field(object): pass elif t == 'geolocation': - return (None, None) + return (None, False) - return (None, None) + return (None, False) def get_prefill_attributes(self): t = self.prefill.get('type') diff --git a/wcs/users.py b/wcs/users.py index c0d9d95..9d1c2a2 100644 --- a/wcs/users.py +++ b/wcs/users.py @@ -33,7 +33,7 @@ class User(StorableObject): anonymous = False form_data = None # dumping ground for custom fields - certified_fields = None + verified_fields = None name_identifiers = None lasso_dump = None -- 2.8.1