From 024c079043c811d6253a18d6d3f9c99474e2fd33 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Fr=C3=A9d=C3=A9ric=20P=C3=A9ters?= Date: Tue, 4 Sep 2018 20:15:42 +0200 Subject: [PATCH] maps: consider layer label when searching on multiple layers (#26112) --- combo/apps/maps/models.py | 14 ++++++++++---- tests/test_maps_cells.py | 31 +++++++++++++++++++++++++++++++ 2 files changed, 41 insertions(+), 4 deletions(-) diff --git a/combo/apps/maps/models.py b/combo/apps/maps/models.py index e700e4e0..4dd8f387 100644 --- a/combo/apps/maps/models.py +++ b/combo/apps/maps/models.py @@ -155,7 +155,7 @@ class MapLayer(models.Model): layer = [x for x in serializers.deserialize('json', json.dumps([json_layer]))][0] layer.save() - def get_geojson(self, request=None): + def get_geojson(self, request=None, multiple_layers=False): response = requests.get(self.geojson_url, remote_service='auto', cache_duration=self.cache_duration, @@ -213,7 +213,11 @@ class MapLayer(models.Model): return True return False - features = [x for x in features if match(x)] + if multiple_layers and query in slugify(self.label): + # also match on layer name, get them all + pass + else: + features = [x for x in features if match(x)] for feature in features: feature['properties']['layer'] = { @@ -272,8 +276,10 @@ class Map(CellBase): def get_geojson(self, request): geojson = {'type': 'FeatureCollection', 'features': []} - for layer in self.layers.all(): - geojson['features'] += layer.get_geojson(request) + layers = self.layers.all() + for layer in layers: + geojson['features'] += layer.get_geojson(request, + multiple_layers=bool(len(layers) > 1)) return geojson @classmethod diff --git a/tests/test_maps_cells.py b/tests/test_maps_cells.py index 57117e20..f1db9651 100644 --- a/tests/test_maps_cells.py +++ b/tests/test_maps_cells.py @@ -100,6 +100,7 @@ def layer(): layer = MapLayer.objects.get() except MapLayer.DoesNotExist: layer = MapLayer() + layer.label = 'bicycles' layer.geojson_url = 'http://example.org/geojson' layer.marker_colour = 'FF0000' layer.icon = 'fa-bicycle' @@ -257,6 +258,10 @@ def test_get_geojson(app, layer, user): assert 'orig=combo' in requests_get.call_args[0][1] assert not 'email=admin%40localhost&' in requests_get.call_args[0][1] + # query against layer name + resp = app.get(reverse('mapcell-geojson', kwargs={'cell_id': cell.id}) + '?q=bicycle') + assert len(json.loads(resp.content)['features']) == 0 + # check distance query on geojson layer.geojson_url = 'http://example.org/geojson?t6' layer.include_user_identifier = False @@ -275,6 +280,32 @@ def test_get_geojson(app, layer, user): resp = app.get(reverse('mapcell-geojson', kwargs={'cell_id': cell.id}) + '?lng=2.54&lat=48.84&distance=100') assert len(json.loads(resp.content)['features']) == 0 + # add a second layer + layer2 = MapLayer() + layer2.label = 'xxx' + layer2.geojson_url = 'http://example.org/geojson' + layer2.marker_colour = 'FF0000' + layer2.icon = 'fa-bicycle' + layer2.icon_colour = '0000FF' + layer2.save() + cell.layers.add(layer2) + + with mock.patch('combo.utils.requests_wrapper.RequestsSession.request') as requests_get: + requests_get.return_value = mock.Mock( + content=SAMPLE_GEOJSON_CONTENT, + json=lambda: json.loads(SAMPLE_GEOJSON_CONTENT), + status_code=200) + resp = app.get(reverse('mapcell-geojson', kwargs={'cell_id': cell.id}) + '?q=bar') + assert len(json.loads(resp.content)['features']) == 2 + + resp = app.get(reverse('mapcell-geojson', kwargs={'cell_id': cell.id}) + '?q=xyz') + assert len(json.loads(resp.content)['features']) == 0 + + # query against layer name, it should get results + resp = app.get(reverse('mapcell-geojson', kwargs={'cell_id': cell.id}) + '?q=bicycle') + assert len(json.loads(resp.content)['features']) == 2 + + def test_get_geojson_properties(app, layer, user): page = Page(title='xxx', slug='new', template_name='standard') page.save() -- 2.19.0.rc1