From 59771a1d1dba1ec9875d0f4ebaf375086989dc32 Mon Sep 17 00:00:00 2001 From: Thomas NOEL Date: Mon, 31 Aug 2015 15:46:41 +0200 Subject: [PATCH] wscall: allow extra data on POST (#6622) --- wcs/formdata.py | 5 ++++- wcs/wf/wscall.py | 35 +++++++++++++++++++++++++++++------ 2 files changed, 33 insertions(+), 7 deletions(-) diff --git a/wcs/formdata.py b/wcs/formdata.py index 1a7d0bb..4684dfc 100644 --- a/wcs/formdata.py +++ b/wcs/formdata.py @@ -545,7 +545,7 @@ class FormData(StorableObject): evo.parts = None self.store() - def export_to_json(self, include_files=True): + def export_to_json(self, include_files=True, extra=None): data = {} data['id'] = '%s/%s' % (self.formdef.url_name, self.id) data['display_id'] = self.get_display_id() @@ -581,6 +581,9 @@ class FormData(StorableObject): if self.workflow_data: data['workflow']['data'] = self.workflow_data + if extra is not None: + data['extra'] = extra + return json.dumps(data, cls=qommon.misc.JSONEncoder, encoding=get_publisher().site_charset) diff --git a/wcs/wf/wscall.py b/wcs/wf/wscall.py index 9f72c41..5e316b5 100644 --- a/wcs/wf/wscall.py +++ b/wcs/wf/wscall.py @@ -16,8 +16,9 @@ import json +from qommon import get_logger from qommon.form import * -from qommon.misc import http_get_page, http_post_request, get_variadic_url +from qommon.misc import http_get_page, http_post_request, get_variadic_url, JSONEncoder from wcs.workflows import WorkflowStatusItem, register_item_class, template_on_formdata from wcs.api import sign_url @@ -32,9 +33,11 @@ class WebserviceCallStatusItem(WorkflowStatusItem): varname = None post = True request_signature_key = None + post_data = None def get_parameters(self): - return ('url', 'post', 'varname', 'request_signature_key') + return ('url', 'post', 'varname', 'request_signature_key', + 'post_data') def add_parameters_widgets(self, form, parameters, prefix='', formdef=None): if 'url' in parameters: @@ -45,10 +48,14 @@ class WebserviceCallStatusItem(WorkflowStatusItem): form.add(CheckboxWidget, '%spost' % prefix, title=_('Post formdata (JSON)'), value=self.post) + if 'post_data' in parameters: + form.add(WidgetDict, '%spost_data' % prefix, + title=_('Post data (Python expressions)'), + value=self.post_data or {}) if 'varname' in parameters: form.add(VarnameWidget, '%svarname' % prefix, title=_('Variable Name'), value=self.varname) - if 'request_signature_key': + if 'request_signature_key' in parameters: form.add(StringWidget, '%srequest_signature_key' % prefix, title=_('Request Signature Key'), value=self.request_signature_key) @@ -69,10 +76,26 @@ class WebserviceCallStatusItem(WorkflowStatusItem): headers = {'Content-type': 'application/json', 'Accept': 'application/json'} - if self.post: - formdata_as_json = formdata.export_to_json() + if self.post or self.post_data: + post_data = None + if self.post_data: + post_data = {} + eval_globals = get_publisher().get_global_eval_dict() + eval_locals = get_publisher().substitutions.get_context_variables() + for (key, expression) in self.post_data.items(): + try: + post_data[key] = eval(expression, eval_globals, eval_locals) + except: + get_logger().warn('Failed to eval() Python expression in webservice call (%r) ' \ + '(workflow %s, status %s)' % (expression, + self.parent.parent.name, self.parent.name)) + if not self.post: + post_data = json.dumps(post_data, cls=JSONEncoder, + encoding=get_publisher().site_charset) + if self.post: + post_data = formdata.export_to_json(extra=post_data) response, status, data, auth_header = http_post_request( - url, formdata_as_json, headers=headers, timeout=TIMEOUT) + url, post_data, headers=headers, timeout=TIMEOUT) else: response, status, data, auth_header = http_get_page( url, headers=headers, timeout=TIMEOUT) -- 2.5.0