From 3f42479e97f54565eb094211ec1e1415909c3c89 Mon Sep 17 00:00:00 2001 From: Benjamin Dauvergne Date: Mon, 6 Jun 2016 12:47:44 +0200 Subject: [PATCH] add option add_user_identifier to wscall (#10806) It adds the user first NameID of user's email as an URL parameter respectively named NameID or email. --- help/fr/wf-wscall.page | 7 +++++++ tests/test_workflows.py | 32 ++++++++++++++++++++++++++++++++ wcs/wf/wscall.py | 20 +++++++++++++++++--- 3 files changed, 56 insertions(+), 3 deletions(-) diff --git a/help/fr/wf-wscall.page b/help/fr/wf-wscall.page index 4317881..3624e79 100644 --- a/help/fr/wf-wscall.page +++ b/help/fr/wf-wscall.page @@ -38,6 +38,13 @@ cas la donnée sera transformée en chaîne de force.

+La case à cocher « Identifier l'utilisateur appelant » indique que l'identifiant +de fédération ou l'email si le premier est absent, doivent être ajoutés comme +paramètre d'URL. Le paramètre s'appelle NameID dans le premier cas +et email dans le second. +

+ +

La case à cocher « Envoyer le formulaire (POST, en JSON) » indique que l'ensemble des données du formulaire doivent être transmises, avec un appel de type POST, dont le contenu correspondra au formulaire encodé au diff --git a/tests/test_workflows.py b/tests/test_workflows.py index 7ee09cb..035ab44 100644 --- a/tests/test_workflows.py +++ b/tests/test_workflows.py @@ -632,7 +632,12 @@ def test_webservice_call(pub): formdef.fields = [] formdef.store() + user = pub.user_class() + user.name_identifiers = ['xxx'] + user.store() + formdata = formdef.data_class()() + formdata.user = user formdata.just_created() formdata.store() @@ -871,6 +876,33 @@ def test_webservice_call(pub): assert qs['evalme'] == [formdata.get_display_id()] assert qs['str'] == ['abcd'] + item = WebserviceCallStatusItem() + item.method = 'GET' + item.post = False + item.url = 'http://remote.example.net?in_url=1' + item.add_user_identifier = True + item.perform(formdata) + assert http_requests.get_last('method') == 'GET' + qs = urlparse.parse_qs(http_requests.get_last('url').split('?')[1]) + assert set(qs.keys()) == set(['in_url', 'NameID']) + assert qs['in_url'] == ['1'] + assert qs['NameID'] == ['xxx'] + + user.name_identifiers = [] + user.email = 'john.doe@example.com' + user.store() + item = WebserviceCallStatusItem() + item.method = 'GET' + item.post = False + item.url = 'http://remote.example.net?in_url=1' + item.add_user_identifier = True + item.perform(formdata) + assert http_requests.get_last('method') == 'GET' + qs = urlparse.parse_qs(http_requests.get_last('url').split('?')[1]) + assert set(qs.keys()) == set(['in_url', 'email']) + assert qs['in_url'] == ['1'] + assert qs['email'] == ['john.doe@example.com'] + def test_timeout(pub): workflow = Workflow(name='timeout') diff --git a/wcs/wf/wscall.py b/wcs/wf/wscall.py index 452ee69..76174d1 100644 --- a/wcs/wf/wscall.py +++ b/wcs/wf/wscall.py @@ -109,6 +109,7 @@ class WebserviceCallStatusItem(WorkflowStatusItem): qs_data = None _method = None response_type = 'json' + add_user_identifier = False action_on_4xx = ':stop' action_on_5xx = ':stop' @@ -140,7 +141,7 @@ class WebserviceCallStatusItem(WorkflowStatusItem): 'action_on_4xx', 'action_on_5xx', 'action_on_bad_data', 'action_on_network_errors', 'notify_on_errors', 'record_errors', 'label', 'method', 'response_type', - 'qs_data') + 'qs_data', 'add_user_identifier') def add_parameters_widgets(self, form, parameters, prefix='', formdef=None): if 'label' in parameters: @@ -160,6 +161,10 @@ class WebserviceCallStatusItem(WorkflowStatusItem): title=_('Query string data'), value=self.qs_data or {}, element_value_type=ComputedExpressionWidget) + if 'add_user_identifier' in parameters: + form.add(CheckboxWidget, '%sadd_user_identifier' % prefix, + title=_('Add user identifier'), + value=self.add_user_identifier) methods = collections.OrderedDict( [('GET', _('GET')), ('POST', _('POST (JSON)'))]) if 'method' in parameters: @@ -244,11 +249,20 @@ class WebserviceCallStatusItem(WorkflowStatusItem): variables = get_publisher().substitutions.get_context_variables() url = get_variadic_url(url, variables) - if self.qs_data: # merge qs_data into url + qs_data = self.qs_data or {} + if self.add_user_identifier: + user = formdata.get_user() + if user: # FIXME: what to I do if there is no user ? fail ? log ? + if user.name_identifiers: + qs_data['NameID'] = user.name_identifiers[0] + elif user.email: + qs_data['email'] = user.email + # FIXME: what do I do if there is no identifier ? fail ? log ? + if qs_data: # merge qs_data into url publisher = get_publisher() parsed = urlparse.urlparse(url) qs = list(urlparse.parse_qsl(parsed.query)) - for key, value in self.qs_data.iteritems(): + for key, value in qs_data.iteritems(): try: value = self.compute(value, raises=True) value = str(value) -- 2.1.4