maps: consider layer label when searching on multiple layers (#26112)

This commit is contained in:
Frédéric Péters 2018-09-04 20:15:42 +02:00
parent b6116cc93f
commit 024c079043
2 changed files with 41 additions and 4 deletions

View File

@ -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

View File

@ -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()