From 3f42479e97f54565eb094211ec1e1415909c3c89 Mon Sep 17 00:00:00 2001
From: Benjamin Dauvergne
+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