From 6ecf6ad6ed55a0091514e6bbabacb6d4244d2981 Mon Sep 17 00:00:00 2001 From: Thomas NOEL Date: Thu, 17 Oct 2019 14:18:07 +0200 Subject: [PATCH] solis: allow filters on rsa-user-info endpoint (#37022) --- passerelle/apps/solis/models.py | 17 ++++++++++++-- tests/test_solis.py | 41 +++++++++++++++++++++++++++++++++ 2 files changed, 56 insertions(+), 2 deletions(-) diff --git a/passerelle/apps/solis/models.py b/passerelle/apps/solis/models.py index eb1818f3..b9d589bb 100644 --- a/passerelle/apps/solis/models.py +++ b/passerelle/apps/solis/models.py @@ -601,10 +601,14 @@ class Solis(BaseResource): 'links': { 'description': _('get linked informations (comma separated list, empty for all)'), 'example_value': 'etatCivil,conjoint', - } + }, + 'filters': { + 'description': _('filter response (list), ex: idStructure=399 or ' + 'idStructure!=399,prescriptionPlacement=Placement'), + }, }) def rsa_user_info(self, request, name_id, user_id, information='individu', - index='search', links=None): + index='search', links=None, filters=None): try: link = SolisRSALink.objects.get(resource=self, name_id=name_id, user_id=user_id) except SolisRSALink.DoesNotExist: @@ -617,6 +621,15 @@ class Solis(BaseResource): if text != link.text: link.text = text link.save() + if filters and isinstance(response, list): + for filter_ in filters.split(','): + key, value = filter_.split('=') + if key.endswith('!'): + response = [item for item in response + if str(item.get(key[:-1])) != value] + else: + response = [item for item in response + if str(item.get(key)) == value] return {'data': response} diff --git a/tests/test_solis.py b/tests/test_solis.py index 12529dea..76b74f58 100644 --- a/tests/test_solis.py +++ b/tests/test_solis.py @@ -65,6 +65,12 @@ RSA_3LINKS = '''{ ] } }''' +RSA_ACTIONS = '''[ + {"idStructure":42, "prescriptionPlacement":"Placement"}, + {"idStructure":42, "prescriptionPlacement":"Prescription"}, + {"idStructure":43, "prescriptionPlacement":"Prescription"}, + {"idStructure":44, "prescriptionPlacement":"Placement"} +]''' @@ -850,6 +856,41 @@ def test_solis_rsa_link_infos_unlink(app, solis): assert resp.json['err_desc'] == 'unknown link' assert resp.json['data'] is None + # get actions, with filters + with mock.patch('passerelle.utils.Request.get') as requests_get: + with mock.patch('passerelle.utils.Request.post') as requests_post: + requests_post.return_value = utils.FakedResponse(content=RSATOKEN, status_code=200) + endpoint_base = utils.generic_endpoint_url('solis', 'rsa-user-info', slug=solis.slug) + endpoint = endpoint_base + '?name_id=%s&user_id=4242&information=actions' % NAMEID + requests_get.return_value = utils.FakedResponse(content=RSA_ACTIONS, + status_code=200) + resp = app.get(endpoint, status=200) + assert requests_post.call_count == 1 # get a token + assert requests_get.call_count == 1 # get actions + assert '/referentiels/grsa/actions/search/' in requests_get.call_args[0][0] + assert resp.json['err'] == 0 + assert len(resp.json['data']) == 4 # all actions + + filtered = endpoint + '&filters=idStructure=42' + resp = app.get(filtered, status=200) + assert len(resp.json['data']) == 2 + assert resp.json['data'][0]['idStructure'] == 42 + + filtered = endpoint + '&filters=idStructure!=42' + resp = app.get(filtered, status=200) + assert len(resp.json['data']) == 2 + assert resp.json['data'][0]['idStructure'] == 43 + assert resp.json['data'][1]['idStructure'] == 44 + + filtered = endpoint + '&filters=idStructure!=42,idStructure!=43,prescriptionPlacement=Placement' + resp = app.get(filtered, status=200) + assert len(resp.json['data']) == 1 + assert resp.json['data'][0]['idStructure'] == 44 + + filtered = endpoint + '&filters=' + resp = app.get(filtered, status=200) + assert len(resp.json['data']) == 4 # empty filters: all actions + # get referential for a linked user with links with mock.patch('passerelle.utils.Request.get') as requests_get: with mock.patch('passerelle.utils.Request.post') as requests_post: