From b054108db865df525431945790589c1ece4a7860 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Fr=C3=A9d=C3=A9ric=20P=C3=A9ters?= Date: Fri, 10 Jul 2015 19:30:12 +0200 Subject: [PATCH] general: expose named data sources as substitution variables (#7762) --- tests/test_datasource.py | 13 ++++++++++++- tests/test_form_pages.py | 33 +++++++++++++++++++++++++++++++++ wcs/data_sources.py | 9 +++++++++ wcs/root.py | 2 ++ 4 files changed, 56 insertions(+), 1 deletion(-) diff --git a/tests/test_datasource.py b/tests/test_datasource.py index 6f65d85..342f03c 100644 --- a/tests/test_datasource.py +++ b/tests/test_datasource.py @@ -19,7 +19,7 @@ def setup_module(module): pub = create_temporary_pub() - req = HTTPRequest(None, {}) + req = HTTPRequest(None, {'SERVER_NAME': 'example.net', 'SCRIPT_NAME': ''}) pub._set_request(req) @@ -176,3 +176,14 @@ def test_register_data_source_function(): assert data_sources.get_items(datasource) == [('1', 'foo', '1'), ('2', 'bar', '2')] assert data_sources.get_structured_items(datasource) == [ {'id': '1', 'text': 'foo'}, {'id': '2', 'text': 'bar'}] + +def test_data_source_substitution_variables(): + NamedDataSource.wipe() + data_source = NamedDataSource(name='foobar') + data_source.data_source = {'type': 'formula', 'value': repr(['un', 'deux'])} + data_source.store() + + pub.substitutions.feed(NamedDataSource) + context = pub.substitutions.get_context_variables() + assert context.get('data_source').foobar == [ + {'id': 'un', 'text': 'un'}, {'id': 'deux', 'text': 'deux'}] diff --git a/tests/test_form_pages.py b/tests/test_form_pages.py index 6119d53..f9a0704 100644 --- a/tests/test_form_pages.py +++ b/tests/test_form_pages.py @@ -8,6 +8,7 @@ from wcs.wf.jump import JumpWorkflowStatusItem from wcs.categories import Category from wcs.roles import Role, logged_users_role from wcs.tracking_code import TrackingCode +from wcs.data_sources import NamedDataSource from wcs import fields from wcs.sessions import BasicSession @@ -307,6 +308,38 @@ def test_form_multi_page_condition_checkbox(pub): resp = resp.forms[0].submit('submit') # should go to second page assert 'f3' in resp.forms[0].fields +def test_form_multi_page_condition_data_source(pub): + formdef = create_formdef() + formdef.fields = [fields.PageField(id='0', label='1st page', type='page'), + fields.BoolField(id='1', label='checkbox', varname='checkbox'), + fields.PageField(id='2', label='2nd page', type='page', + condition='len(data_source.foobar) > 0'), + fields.StringField(id='3', label='string 2')] + formdef.store() + + # add the named data source, empty + NamedDataSource.wipe() + data_source = NamedDataSource(name='foobar') + data_source.data_source = {'type': 'formula', 'value': repr([])} + data_source.store() + + resp = get_app(pub).get('/test/') + formdef.data_class().wipe() + resp = resp.forms[0].submit('submit') # should go straight to validation + assert 'Check values then click submit.' in resp.body + assert resp.forms[0]['previous'] + resp = resp.forms[0].submit('previous') + assert resp.forms[0]['f1'] + + # replace the named data source with one with items + NamedDataSource.wipe() + data_source = NamedDataSource(name='foobar') + data_source.data_source = {'type': 'formula', 'value': repr(['un', 'deux'])} + data_source.store() + + resp = resp.forms[0].submit('submit') # should go to second page + assert 'f3' in resp.forms[0].fields + def test_form_submit_with_user(pub): create_user(pub) formdef = create_formdef() diff --git a/wcs/data_sources.py b/wcs/data_sources.py index 360f052..f8d4cd8 100644 --- a/wcs/data_sources.py +++ b/wcs/data_sources.py @@ -229,3 +229,12 @@ class NamedDataSource(XmlStorableObject): return objects[0] raise KeyError() get_by_slug = classmethod(get_by_slug) + + @classmethod + def get_substitution_variables(cls): + return {'data_source': DataSourcesSubstitutionProxy()} + + +class DataSourcesSubstitutionProxy(object): + def __getattr__(self, attr): + return get_structured_items(NamedDataSource.get_by_slug(attr).data_source) diff --git a/wcs/root.py b/wcs/root.py index 778e9bd..8c88947 100644 --- a/wcs/root.py +++ b/wcs/root.py @@ -46,6 +46,7 @@ import qommon.pages from qommon.afterjobs import AfterJobStatusDirectory from categories import Category +from data_sources import NamedDataSource from formdef import FormDef from anonylink import AnonymityLink from roles import Role @@ -336,6 +337,7 @@ class RootDirectory(Directory): response.breadcrumb = [ ('', _('Home')) ] get_publisher().substitutions.feed(get_request().user) + get_publisher().substitutions.feed(NamedDataSource) if not self.admin: self.admin = get_publisher().admin_directory_class() -- 2.1.4