maps: consider layer label when searching on multiple layers (#26112)
This commit is contained in:
parent
b6116cc93f
commit
024c079043
|
@ -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
|
||||
|
|
|
@ -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()
|
||||
|
|
Loading…
Reference in New Issue