csvdatasource: provide a ?id= filter to queries (#31491)

This commit is contained in:
Frédéric Péters 2019-03-17 09:27:33 +01:00
parent 585d1a1656
commit dc80587d5c
2 changed files with 29 additions and 0 deletions

View File

@ -369,6 +369,12 @@ class CsvDataSource(BaseResource):
new_data.append(dict(zip(titles, new_row)))
data = new_data
if 'id' in request.GET:
# always provide a ?id= filter.
filters = ["id == %r" % request.GET['id']]
data = [row for new_row, row in stream_expressions(filters, data, kind='filters')
if new_row[0]]
# allow jsonp queries by select2
# filtering is done there after projection because we need a projection named text for
# retro-compatibility with previous use of the csvdatasource with select2

View File

@ -691,6 +691,29 @@ def test_query_filter_multiline(app, setup, filetype):
assert response.json['err'] == 0
assert len(response.json['data']) == 2
def test_query_builtin_id_filter(app, setup, filetype):
csvdata, _url = setup('id,whatever,nom,prenom,sexe', filename=filetype,
data=get_file_content(filetype))
url = reverse('generic-endpoint', kwargs={
'connector': 'csvdatasource',
'slug': csvdata.slug,
'endpoint': 'query/query-1_/',
})
query = Query(slug='query-1_', resource=csvdata)
query.save()
assert len(app.get(url).json['data']) == 20
assert len(app.get(url + '?id=121').json['data']) == 1
assert app.get(url + '?id=121').json['data'][0]['prenom'] == 'Eliot'
assert app.get(url + '?id=525').json['data'][0]['prenom'] == 'Shanone'
# check when combined with another filter
query.filters = 'sexe == "H"'
query.save()
assert len(app.get(url).json['data']) == 10
assert app.get(url + '?id=121').json['data'][0]['prenom'] == 'Eliot'
assert len(app.get(url + '?id=525').json['data']) == 0
def test_delete_connector_query(admin_user, app, setup, filetype):
csvdata, url = setup('id,whatever,nom,prenom,sexe', filename=filetype, data=get_file_content(filetype))