From 1c8d11b58d32bcce71e250e40bcd9caec0f45221 Mon Sep 17 00:00:00 2001 From: Benjamin Dauvergne Date: Thu, 16 Mar 2017 16:23:24 +0100 Subject: [PATCH 1/4] factorize WorklowStatusItem.compute(..) (#14510) --- wcs/qommon/misc.py | 30 ++++++++++++++++++++++++++++++ wcs/workflows.py | 28 ++-------------------------- wcs/wscalls.py | 8 ++++---- 3 files changed, 36 insertions(+), 30 deletions(-) diff --git a/wcs/qommon/misc.py b/wcs/qommon/misc.py index 23ee2ca..687fb83 100644 --- a/wcs/qommon/misc.py +++ b/wcs/qommon/misc.py @@ -520,3 +520,33 @@ def file_digest(content, chunk_size=100000): for chunk in iter(read_chunk, ''): digest.update(chunk) return digest.hexdigest() + + +def compute(expr, do_ezt=True, raises=False, context=None): + if not isinstance(expr, basestring): + return expr + + if not expr.startswith('=') and not do_ezt: + return expr + + vars = get_publisher().substitutions.get_context_variables() + vars.update(context or {}) + + if not expr.startswith('='): + try: + processor = ezt.Template(compress_whitespace=False) + processor.parse(expr) + fd = StringIO() + processor.generate(fd, vars) + return fd.getvalue() + except ezt.EZTException: + if raises: + raise + return expr + + try: + return eval(expr[1:], get_publisher().get_global_eval_dict(), vars) + except: + if raises: + raise + return expr diff --git a/wcs/workflows.py b/wcs/workflows.py index 42ad9ca..0396541 100644 --- a/wcs/workflows.py +++ b/wcs/workflows.py @@ -31,7 +31,7 @@ import hashlib from quixote import get_request, redirect from qommon import _ -from qommon.misc import C_, get_as_datetime, file_digest +from qommon.misc import C_, get_as_datetime, file_digest, compute from qommon.storage import StorableObject, atomic_write from qommon.form import * from qommon.humantime import seconds2humanduration @@ -1605,31 +1605,7 @@ class WorkflowStatusItem(XmlSerialisable): @classmethod def compute(cls, var, do_ezt=True, raises=False): - if not isinstance(var, basestring): - return var - - 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: - if raises: - raise - return var + return compute(var, do_ezt=do_ezt, raises=raises) def get_substitution_variables(self, formdata): return {} diff --git a/wcs/wscalls.py b/wcs/wscalls.py index fa83bfa..7af56e2 100644 --- a/wcs/wscalls.py +++ b/wcs/wscalls.py @@ -25,7 +25,7 @@ from quixote import get_publisher from qommon import _ from qommon.misc import (simplify, http_get_page, http_post_request, - get_variadic_url, JSONEncoder, json_loads) + get_variadic_url, JSONEncoder, json_loads, compute) from qommon.xml_storage import XmlStorableObject from qommon.form import (CompositeWidget, StringWidget, WidgetDict, ComputedExpressionWidget, RadiobuttonsWidget, CheckboxWidget) @@ -60,7 +60,7 @@ def call_webservice(url, qs_data=None, request_signature_key=None, qs = list(urlparse.parse_qsl(parsed.query)) for key, value in qs_data.iteritems(): try: - value = WorkflowStatusItem.compute(value, raises=True) + value = compute(value, raises=True) value = str(value) except: get_publisher().notify_of_exception(sys.exc_info()) @@ -72,7 +72,7 @@ def call_webservice(url, qs_data=None, request_signature_key=None, url = urlparse.urlunparse(parsed[:4] + (qs,) + parsed[5:6]) if request_signature_key: - signature_key = WorkflowStatusItem.compute(request_signature_key) + signature_key = compute(request_signature_key) if signature_key: url = sign_url(url, signature_key) @@ -84,7 +84,7 @@ def call_webservice(url, qs_data=None, request_signature_key=None, payload = {} for (key, value) in post_data.items(): try: - payload[key] = WorkflowStatusItem.compute(value, raises=True) + payload[key] = compute(value, raises=True) except: get_publisher().notify_of_exception(sys.exc_info()) -- 2.1.4