From 2616056e906875b883bd99929bb96b9831b2626b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Fr=C3=A9d=C3=A9ric=20P=C3=A9ters?= Date: Sat, 21 May 2016 09:25:10 +0200 Subject: [PATCH] workflows: make computed fields support both ezt and python (#10547) --- tests/test_workflows.py | 34 ++++++++++++++++++++++++++++++++++ wcs/workflows.py | 24 +++++++++++++++++++----- 2 files changed, 53 insertions(+), 5 deletions(-) diff --git a/tests/test_workflows.py b/tests/test_workflows.py index 0a52400..66bee97 100644 --- a/tests/test_workflows.py +++ b/tests/test_workflows.py @@ -103,6 +103,39 @@ def test_get_json_export_dict(pub): assert root['statuses'][1]['forced_endpoint'] is True assert root['statuses'][1]['endpoint'] is True +def test_variable_compute(pub): + FormDef.wipe() + formdef = FormDef() + formdef.name = 'foobar' + formdef.fields = [StringField(id='1', label='Test', type='string', varname='foo'),] + formdef.store() + + formdata = formdef.data_class()() + formdata.data = {'1': 'hello'} + formdata.store() + pub.substitutions.feed(formdata) + + item = JumpWorkflowStatusItem() + + # straight string + assert item.compute('blah') == 'blah' + + # ezt string + assert item.compute('[form_var_foo]') == 'hello' + # ezt string, but not ezt asked + assert item.compute('[form_var_foo]', do_ezt=False) == '[form_var_foo]' + # ezt string, with an error + assert item.compute('[end]', raises=False) == '[end]' + with pytest.raises(Exception): + item.compute('[end]', raises=True) + + # python expression + assert item.compute('=form_var_foo') == 'hello' + # python expression, with an error + assert item.compute('=1/0', raises=False) == '=1/0' + with pytest.raises(Exception): + item.compute('=1/0', raises=True) + def test_jump_nothing(pub): FormDef.wipe() formdef = FormDef() @@ -171,6 +204,7 @@ def test_jump_count_condition(pub): formdef.name = 'foobar' formdef.store() pub.substitutions.feed(formdef) + formdef.data_class().wipe() formdata = formdef.data_class()() item = JumpWorkflowStatusItem() item.condition = 'form_objects.count < 2' diff --git a/wcs/workflows.py b/wcs/workflows.py index ecd7630..3635a58 100644 --- a/wcs/workflows.py +++ b/wcs/workflows.py @@ -1484,12 +1484,26 @@ class WorkflowStatusItem(XmlSerialisable): value = getattr(self, '%s_parse' % f)(value) setattr(self, f, value) - def compute(self, var, raises=False): + def compute(self, var, do_ezt=True, raises=False): if not isinstance(var, basestring): return var - if not var.startswith('='): + + if not var.startswith('=') and not do_ezt: return var + vars = get_publisher().substitutions.get_context_variables() + if not var.startswith('='): + try: + processor = ezt.Template(compress_whitespace=False) + processor.parse(var) + fd = StringIO() + processor.generate(fd, vars) + return fd.getvalue() + except ezt.EZTException: + if raises: + raise + return var + try: return eval(var[1:], get_publisher().get_global_eval_dict(), vars) except: @@ -1877,13 +1891,13 @@ class SendmailWorkflowStatusItem(WorkflowStatusItem): url = formdata.get_url() try: - mail_body = template_on_formdata(formdata, self.compute(self.body)) + mail_body = template_on_formdata(formdata, self.compute(self.body, do_ezt=False)) except ezt.EZTException: get_logger().error('error in template for email body [%s], mail could not be generated' % url) return try: - mail_subject = template_on_formdata(formdata, self.compute(self.subject)) + mail_subject = template_on_formdata(formdata, self.compute(self.subject, do_ezt=False)) except ezt.EZTException: get_logger().error('error in template for email subject [%s], mail could not be generated' % url) return @@ -2052,7 +2066,7 @@ class SendSMSWorkflowStatusItem(WorkflowStatusItem): return try: - sms_body = template_on_formdata(formdata, self.compute(self.body)) + sms_body = template_on_formdata(formdata, self.compute(self.body, do_ezt=False)) except ezt.EZTException: url = formdata.get_url() get_logger().error('error in template for sms [%s], sms could not be generated' % url) -- 2.8.1