From 680ec3aa7e9b252f9a5353b2a25163acada6c059 Mon Sep 17 00:00:00 2001 From: Valentin Deniaud Date: Wed, 25 Mar 2020 16:11:46 +0100 Subject: [PATCH 5/5] opengis: add bbox filter for custom queries (#20535) --- passerelle/apps/opengis/models.py | 20 +++++++++++++++++--- tests/test_opengis.py | 8 +++++++- 2 files changed, 24 insertions(+), 4 deletions(-) diff --git a/passerelle/apps/opengis/models.py b/passerelle/apps/opengis/models.py index a4f4805b..38992e00 100644 --- a/passerelle/apps/opengis/models.py +++ b/passerelle/apps/opengis/models.py @@ -375,10 +375,16 @@ class OpenGIS(BaseResource): description=_('Query'), pattern=r'^(?P[\w:_-]+)/$', perm='can_access', + parameters={ + 'bbox': { + 'description': _('Only include results inside bounding box'), + 'example_value': '-0.489,51.28,0.236,51.686' + } + }, show=False) - def query(self, request, query_slug): + def query(self, request, query_slug, bbox=None): query = get_object_or_404(Query, resource=self, slug=query_slug) - return query.q(request) + return query.q(request, bbox) def export_json(self): d = super(OpenGIS, self).export_json() @@ -441,10 +447,18 @@ class Query(BaseQuery): endpoint.parameters = resource_endpoint.parameters return endpoint - def q(self, request): + def q(self, request, bbox): features = self.features.all() if not features.exists(): raise APIError('Data is not synchronized yet. Retry in a few minutes.') + if bbox: + try: + lonmin, latmin, lonmax, latmax = (float(x) for x in bbox.split(',')) + except (ValueError, AttributeError): + raise APIError('Invalid bbox parameter, it must be a comma separated list of ' + 'floating point numbers of the form lonmin,latmin,lonmax,latmax') + features = features.filter(lon__gte=lonmin, lon__lte=lonmax, lat__gte=latmin, + lat__lte=latmax) data = { 'type': 'FeatureCollection', 'name': self.typename diff --git a/tests/test_opengis.py b/tests/test_opengis.py index 90e3ece6..91a952e1 100644 --- a/tests/test_opengis.py +++ b/tests/test_opengis.py @@ -552,6 +552,12 @@ def test_opengis_query_q_endpoint(mocked_get, app, connector, query): if feature['geometry']['coordinates'][0] == 1914059.51) assert feature_data == feature.data + resp = app.get(endpoint + '?bbox=1914041,4224660,1914060,4224670') + assert len(resp.json['features']) == 1 + + resp = app.get(endpoint + '?bbox=wrong') + assert resp.json['err'] == 1 + @mock.patch('passerelle.utils.Request.get') def test_opengis_query_cache_update_change(mocked_get, app, connector, query): @@ -635,7 +641,7 @@ def test_opengis_query_endpoint_documentation(mocked_get, app, connector, query) resp = app.get(connector.get_absolute_url()) assert query.name in resp.text assert query.description in resp.text - assert '/opengis/test/q/test_query/' in resp.text + assert '/opengis/test/query/test_query/?bbox=' in resp.text def test_opengis_export_import(query): -- 2.20.1