solis: allow filters on rsa-user-info endpoint (#37022)

This commit is contained in:
Thomas NOËL 2019-10-17 14:18:07 +02:00
parent 676229752a
commit 6ecf6ad6ed
2 changed files with 56 additions and 2 deletions

View File

@ -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}

View File

@ -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: