Projet

Général

Profil

0005-opengis-add-bbox-filter-for-custom-queries-20535.patch

Valentin Deniaud, 08 avril 2020 14:40

Télécharger (3,35 ko)

Voir les différences:

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(-)
passerelle/apps/opengis/models.py
375 375
              description=_('Query'),
376 376
              pattern=r'^(?P<query_slug>[\w:_-]+)/$',
377 377
              perm='can_access',
378
              parameters={
379
                  'bbox': {
380
                      'description': _('Only include results inside bounding box'),
381
                      'example_value': '-0.489,51.28,0.236,51.686'
382
                  }
383
              },
378 384
              show=False)
379
    def query(self, request, query_slug):
385
    def query(self, request, query_slug, bbox=None):
380 386
        query = get_object_or_404(Query, resource=self, slug=query_slug)
381
        return query.q(request)
387
        return query.q(request, bbox)
382 388

  
383 389
    def export_json(self):
384 390
        d = super(OpenGIS, self).export_json()
......
441 447
        endpoint.parameters = resource_endpoint.parameters
442 448
        return endpoint
443 449

  
444
    def q(self, request):
450
    def q(self, request, bbox):
445 451
        features = self.features.all()
446 452
        if not features.exists():
447 453
            raise APIError('Data is not synchronized yet. Retry in a few minutes.')
454
        if bbox:
455
            try:
456
                lonmin, latmin, lonmax, latmax = (float(x) for x in bbox.split(','))
457
            except (ValueError, AttributeError):
458
                raise APIError('Invalid bbox parameter, it must be a comma separated list of '
459
                               'floating point numbers of the form lonmin,latmin,lonmax,latmax')
460
            features = features.filter(lon__gte=lonmin, lon__lte=lonmax, lat__gte=latmin,
461
                                       lat__lte=latmax)
448 462
        data = {
449 463
            'type': 'FeatureCollection',
450 464
            'name': self.typename
tests/test_opengis.py
552 552
                        if feature['geometry']['coordinates'][0] == 1914059.51)
553 553
    assert feature_data == feature.data
554 554

  
555
    resp = app.get(endpoint + '?bbox=1914041,4224660,1914060,4224670')
556
    assert len(resp.json['features']) == 1
557

  
558
    resp = app.get(endpoint + '?bbox=wrong')
559
    assert resp.json['err'] == 1
560

  
555 561

  
556 562
@mock.patch('passerelle.utils.Request.get')
557 563
def test_opengis_query_cache_update_change(mocked_get, app, connector, query):
......
635 641
    resp = app.get(connector.get_absolute_url())
636 642
    assert query.name in resp.text
637 643
    assert query.description in resp.text
638
    assert '/opengis/test/q/test_query/' in resp.text
644
    assert '/opengis/test/query/test_query/?bbox=' in resp.text
639 645

  
640 646

  
641 647
def test_opengis_export_import(query):
642
-