opendatasoft: add limit parameter to queries (#55698)

This commit is contained in:
Nicolas Roche 2021-07-20 12:25:31 +02:00
parent 27380a6dd1
commit 3d569fa1d1
3 changed files with 39 additions and 11 deletions

View File

@ -0,0 +1,22 @@
# -*- coding: utf-8 -*-
# Generated by Django 1.11.29 on 2021-07-20 10:13
from __future__ import unicode_literals
from django.db import migrations, models
class Migration(migrations.Migration):
dependencies = [
('opendatasoft', '0003_query_sort'),
]
operations = [
migrations.AddField(
model_name='query',
name='limit',
field=models.PositiveIntegerField(
default=10, help_text='Number of results to return in a single call', verbose_name='Limit'
),
),
]

View File

@ -65,7 +65,7 @@ class OpenDataSoft(BaseResource):
return instance
def call_search(
self, dataset=None, text_template='', filter_expression='', sort=None, id=None, q=None, limit=None
self, dataset=None, text_template='', filter_expression='', sort=None, limit=None, id=None, q=None
):
scheme, netloc, path, params, query, fragment = urlparse.urlparse(self.service_url)
path = urlparse.urljoin(path, 'api/records/1.0/search/')
@ -109,15 +109,15 @@ class OpenDataSoft(BaseResource):
'dataset': {'description': _('Dataset')},
'text_template': {'description': _('Text template')},
'sort': {'description': _('Sort field')},
'limit': {'description': _('Maximum items')},
'id': {'description': _('Record identifier')},
'q': {'description': _('Full text query')},
'limit': {'description': _('Maximum items')},
},
)
def search(
self, request, dataset=None, text_template='', sort=None, id=None, q=None, limit=None, **kwargs
self, request, dataset=None, text_template='', sort=None, limit=None, id=None, q=None, **kwargs
):
result = self.call_search(dataset, text_template, '', sort, id, q, limit)
result = self.call_search(dataset, text_template, '', sort, limit, id, q)
return {'data': result}
@endpoint(
@ -165,6 +165,11 @@ class Query(BaseQuery):
max_length=256,
blank=True,
)
limit = models.PositiveIntegerField(
default=10,
verbose_name='Limit',
help_text=_('Number of results to return in a single call'),
)
delete_view = 'opendatasoft-query-delete'
edit_view = 'opendatasoft-query-edit'
@ -177,9 +182,9 @@ class Query(BaseQuery):
[x.strip() for x in str(self.filter_expression).splitlines() if x.strip()]
),
sort=self.sort,
limit=self.limit,
id=kwargs.get('id'),
q=kwargs.get('q'),
limit=kwargs.get('limit'),
)
def as_endpoint(self):

View File

@ -143,12 +143,13 @@ def query(connector):
description='Rechercher une adresse',
dataset='referentiel-adresse-test',
text_template='{{numero}} {{nom_rue}} {{nom_commun}}',
sort='-nom_rue',
filter_expression='''
refine.source=Ville et Eurométropole de Strasbourg
exclude.numero=42
exclude.numero=43
''',
sort='-nom_rue',
limit=3,
)
@ -233,16 +234,16 @@ def test_search_using_q(mocked_get, app, connector):
'dataset': 'referentiel-adresse-test',
'text_template': '{{numero}} {{nom_rue}} {{nom_commun}}',
'sort': '-nom_rue',
'limit': '3',
'q': "rue de l'aubepine",
'limit': 3,
}
mocked_get.return_value = utils.FakedResponse(content=FAKED_CONTENT_Q_SEARCH, status_code=200)
resp = app.get(endpoint, params=params, status=200)
assert mocked_get.call_args[1]['params'] == {
'apikey': 'my_secret',
'dataset': 'referentiel-adresse-test',
'q': "rue de l'aubepine",
'rows': '3',
'q': "rue de l'aubepine",
}
assert not resp.json['err']
assert len(resp.json['data']) == 3
@ -296,7 +297,7 @@ def test_query_q(mocked_get, app, query):
'refine.source': ['Ville et Eurométropole de Strasbourg'],
'exclude.numero': ['42', '43'],
'sort': '-nom_rue',
'rows': '3',
'rows': 3,
}
assert not resp.json['err']
assert len(resp.json['data']) == 3
@ -321,7 +322,6 @@ def test_query_q_using_q(mocked_get, app, query):
endpoint = '/opendatasoft/my_connector/q/my_query/'
params = {
'q': "rue de l'aubepine",
'limit': 3,
}
mocked_get.return_value = utils.FakedResponse(content=FAKED_CONTENT_Q_SEARCH, status_code=200)
resp = app.get(endpoint, params=params, status=200)
@ -330,8 +330,8 @@ def test_query_q_using_q(mocked_get, app, query):
'dataset': 'referentiel-adresse-test',
'refine.source': ['Ville et Eurométropole de Strasbourg'],
'exclude.numero': ['42', '43'],
'rows': 3,
'q': "rue de l'aubepine",
'rows': '3',
}
assert not resp.json['err']
assert len(resp.json['data']) == 3
@ -364,6 +364,7 @@ def test_query_q_using_id(mocked_get, app, query):
'dataset': 'referentiel-adresse-test',
'refine.source': ['Ville et Eurométropole de Strasbourg'],
'exclude.numero': ['42', '43'],
'rows': 3,
'q': 'recordid:7cafcd5c692773e8b863587b2d38d6be82e023d8',
}
assert len(resp.json['data']) == 1