Projet

Général

Profil

0001-maps-geojson-url-per-geojson-layer-40742.patch

Lauréline Guérin, 03 avril 2020 11:11

Télécharger (29 ko)

Voir les différences:

Subject: [PATCH] maps: geojson url per geojson layer (#40742)

 combo/apps/maps/models.py                    |  37 +++---
 combo/apps/maps/static/js/combo.map.js       |  87 +++++++-------
 combo/apps/maps/templates/maps/map_cell.html |   6 +-
 combo/apps/maps/urls.py                      |   2 +-
 combo/apps/maps/views.py                     |  24 ++--
 tests/test_maps_cells.py                     | 112 ++++++++++---------
 tests/test_maps_manager.py                   |   4 +-
 7 files changed, 137 insertions(+), 135 deletions(-)
combo/apps/maps/models.py
177 177
        layer = next(serializers.deserialize('json', json.dumps([json_layer]), ignorenonexistent=True))
178 178
        layer.save()
179 179

  
180
    def get_geojson(self, request=None, multiple_layers=False):
180
    def get_geojson(self, request):
181 181
        geojson_url = get_templated_url(self.geojson_url)
182
        response = requests.get(geojson_url,
183
                            remote_service='auto',
184
                            cache_duration=self.cache_duration,
185
                            user=request.user if (request and self.include_user_identifier) else None,
186
                            without_user=not(self.include_user_identifier),
187
                            headers={'accept': 'application/json'})
182
        response = requests.get(
183
            geojson_url,
184
            remote_service='auto',
185
            cache_duration=self.cache_duration,
186
            user=request.user if (request and self.include_user_identifier) else None,
187
            without_user=not(self.include_user_identifier),
188
            headers={'accept': 'application/json'})
188 189
        if not response.ok:
189 190
            return []
190 191
        data = response.json()
......
229 230
            # all words must match
230 231
            query_words = [slugify(x) for x in request.GET['q'].split()]
231 232

  
232
            additional_strings = []
233
            if multiple_layers:  # also match on layer name
234
                additional_strings = [self.label]
235

  
236 233
            def match(feature):
237 234
                matching_query_words = set()
238
                feature_words = additional_strings[:]
235
                feature_words = []
239 236

  
240 237
                def get_feature_words(properties):
241 238
                    for property in properties.values():
......
265 262
                'identifier': self.slug,
266 263
                'properties': properties,
267 264
            }
268
        return features
265
        return {'type': 'FeatureCollection', 'features': features}
269 266

  
270 267

  
271 268
@register_cell_class
......
318 315
                  'max_zoom', 'group_markers', 'marker_behaviour_onclick')
319 316
        return forms.models.modelform_factory(self.__class__, fields=fields)
320 317

  
321
    def get_geojson(self, request):
322
        geojson = {'type': 'FeatureCollection', 'features': []}
323
        layers = self.layers.filter(kind='geojson')
324
        for layer in layers:
325
            geojson['features'] += layer.get_geojson(request,
326
                    multiple_layers=bool(len(layers) > 1))
327
        return geojson
328

  
329 318
    @classmethod
330 319
    def is_enabled(cls):
331 320
        return MapLayer.objects.exists()
......
362 351
            })
363 352
        return tiles_layers
364 353

  
354
    def get_geojson_layers(self):
355
        return [reverse_lazy('mapcell-geojson', kwargs={'cell_id': self.pk, 'layer_slug': l.slug})
356
                for l in self.layers.filter(kind='geojson')]
357

  
365 358
    def get_cell_extra_context(self, context):
366 359
        ctx = super(Map, self).get_cell_extra_context(context)
367 360
        ctx['title'] = self.title
......
372 365
        ctx['initial_zoom'] = self.initial_zoom
373 366
        ctx['min_zoom'] = self.min_zoom
374 367
        ctx['max_zoom'] = self.max_zoom
375
        ctx['geojson_url'] = reverse_lazy('mapcell-geojson', kwargs={'cell_id': self.pk})
368
        ctx['geojson_layers'] = self.get_geojson_layers()
376 369
        ctx['tiles_layers'] = self.get_tiles_layers()
377 370
        ctx['max_bounds'] = settings.COMBO_MAP_MAX_BOUNDS
378 371
        ctx['group_markers'] = self.group_markers
combo/apps/maps/static/js/combo.map.js
1 1
$(function() {
2 2
    L.Map.include(
3 3
      {
4
        add_geojson_layer: function(callback) {
4
        add_geojson_layer: function(callback, geojson_url) {
5 5
          var map = this;
6 6
          var $map_widget = $(map.getContainer());
7 7
          var cell = $map_widget.parents('div.cell')[0];
8
          var geojson_url = $map_widget.data('geojson-url');
9
          if (!geojson_url) return;
10 8

  
11
          if (map.geojson_retrieval) {
12
             map.geojson_retrieval.abort();
13
          }
14

  
15
          map.geojson_retrieval = $.getJSON(geojson_url, function(data) {
9
          $.getJSON(geojson_url, function(data) {
16 10
              var geo_json = L.geoJson(data, {
17 11
                  onEachFeature: function(feature, layer) {
18 12
                      $(cell).trigger('combo:map-feature-prepare', {'feature': feature, 'layer': layer});
......
63 57
                      return L.marker(latlng, {icon: marker});
64 58
                  }
65 59
              });
66
              if (map.geo_json) map.geo_json.remove();
67
              map.geo_json = geo_json;
68 60
              if ($map_widget.data('group-markers')) {
69
                  if (! map.clustered_markers) {
70
                    map.clustered_markers = L.markerClusterGroup({showCoverageOnHover: false,
71
                                          zoomToBoundsOnClick: true,
72
                                          removeOutsideVisibleBounds: true,
73
                                          iconCreateFunction: function (cluster) {
74
                                              var icon_size = 60;
75
                                              var childCount = cluster.getChildCount();
76
                                              var icon_html = '<div><span>' + childCount + '</span></div>';
77
                                              var c = ' marker-cluster-';
78
                                              if (childCount < 10) {
79
                                                  c += 'small';
80
                                              } else if (childCount < 100) {
81
                                                  c += 'medium';
82
                                              } else {
83
                                                  c += 'large';
84
                                              }
85
                                              return new L.DivIcon({html: icon_html, className: 'marker-cluster' + c, iconSize: new L.Point(icon_size, icon_size)});
86
                                              }});
87
                    map.addLayer(map.clustered_markers);
88
                  }
89
                  map.clustered_markers.eachLayer(
90
                    function(layer) {
91
                       map.clustered_markers.removeLayer(layer);
92
                    }
93
                  );
94
                  map.clustered_markers.addLayer(geo_json);
61
                  clustered_markers = L.markerClusterGroup({
62
                      showCoverageOnHover: false,
63
                      zoomToBoundsOnClick: true,
64
                      removeOutsideVisibleBounds: true,
65
                      iconCreateFunction: function (cluster) {
66
                          var icon_size = 60;
67
                          var childCount = cluster.getChildCount();
68
                          var icon_html = '<div><span>' + childCount + '</span></div>';
69
                          var c = ' marker-cluster-';
70
                          if (childCount < 10) {
71
                              c += 'small';
72
                          } else if (childCount < 100) {
73
                              c += 'medium';
74
                          } else {
75
                              c += 'large';
76
                          }
77
                          return new L.DivIcon({html: icon_html, className: 'marker-cluster' + c, iconSize: new L.Point(icon_size, icon_size)});
78
                      }
79
                  });
80
                  map.addLayer(clustered_markers);
81
                  clustered_markers.addLayer(geo_json);
95 82
              } else {
96 83
                  geo_json.addTo(map);
97 84
              }
......
123 110
        if (!isNaN(min_zoom)) map_options.minZoom = min_zoom;
124 111
        map_options.zoomControl = false;
125 112
        var latlng = [$map_widget.data('init-lat'), $map_widget.data('init-lng')];
126
        var geojson_url = $map_widget.data('geojson-url');
127 113
        if ($map_widget.data('max-bounds-lat1')) {
128 114
          map_options.maxBounds = L.latLngBounds(
129 115
                  L.latLng($map_widget.data('max-bounds-lat1'), $map_widget.data('max-bounds-lng1')),
......
185 171
                }
186 172
            ).addTo(map);
187 173
        });
188
        if (geojson_url) {
189
            map.add_geojson_layer(function(geo_json) {
190
                var bounds = geo_json.getBounds();
191
                if (bounds.isValid()) {
192
                    if (init_state == 'fit-markers') {
193
                        map.fitBounds(bounds);
174
        map.bounds = null;
175
        map.geojson_layers_loaded = 0;
176
        var geojson_layers = window['geojson_'+map_id];
177
        if (geojson_layers.length) {
178
            $.each(geojson_layers, function(idx, geojson_url) {
179
                map.add_geojson_layer(function(geo_json) {
180
                    var bounds = geo_json.getBounds();
181
                    if (bounds.isValid()) {
182
                        if (!map.bounds) {
183
                            map.bounds = L.latLngBounds(bounds);
184
                        } else {
185
                            map.bounds.extend(bounds);
186
                        }
187
                        if (init_state == 'fit-markers') {
188
                            map.fitBounds(map.bounds);
189
                        }
194 190
                    }
191
                }, geojson_url);
192
                map.geojson_layers_loaded += 1;
193
                if (map.geojson_layers_loaded == geojson_layers.length) {
194
                    $(cell).trigger('combo:map-ready');
195 195
                }
196
                $(cell).trigger('combo:map-ready');
197 196
            });
198 197
        } else {
199 198
            $(cell).trigger('combo:map-ready');
combo/apps/maps/templates/maps/map_cell.html
5 5
<div class="combo-cell-map" data-init-state="{{ initial_state }}"
6 6
        data-init-zoom="{{ initial_zoom }}" data-min-zoom="{{ min_zoom }}"
7 7
        data-max-zoom="{{ max_zoom }}" data-init-lat="{{ init_lat }}"
8
        data-init-lng="{{ init_lng }}" data-geojson-url="{{ geojson_url }}"
8
        data-init-lng="{{ init_lng }}"
9 9
        data-include-geoloc-button="true"
10 10
        {% if group_markers %}data-group-markers="1"{% endif %}
11 11
        data-marker-behaviour-onclick="{{ cell.marker_behaviour_onclick }}"
......
27 27
      opacity: {{ layer.opacity|as_json|safe }}
28 28
    });
29 29
  {% endfor %}
30
  var geojson_{{ cell.pk }} = [];
31
  {% for layer_url in geojson_layers %}
32
    geojson_{{ cell.pk }}.push('{{ layer_url }}');
33
  {% endfor %}
30 34
</script>
31 35
</div>
32 36
{% endblock %}
combo/apps/maps/urls.py
43 43
urlpatterns = [
44 44
    url(r'^manage/maps/', decorated_includes(manager_required,
45 45
        include(maps_manager_urls))),
46
    url(r'^ajax/mapcell/geojson/(?P<cell_id>\w+)/$', GeojsonView.as_view(),
46
    url(r'^ajax/mapcell/geojson/(?P<cell_id>\d+)/(?P<layer_slug>[\w-]+)/$', GeojsonView.as_view(),
47 47
        name='mapcell-geojson'),
48 48
]
combo/apps/maps/views.py
16 16

  
17 17
import json
18 18

  
19
from django.http import HttpResponse, HttpResponseForbidden
20
from django.shortcuts import get_object_or_404
19 21
from django.views.generic.base import View
20
from django.http import HttpResponse, Http404, HttpResponseForbidden
21 22

  
22 23
from .models import Map
23 24

  
......
25 26
class GeojsonView(View):
26 27

  
27 28
    def get(self, request, *args, **kwargs):
28
        try:
29
            cell = Map.objects.get(pk=kwargs['cell_id'])
30
        except Map.DoesNotExist:
31
            raise Http404()
32
        if cell.page.is_visible(request.user) and cell.is_visible(request.user):
33
            geojson = cell.get_geojson(request)
34
            content_type = 'application/json'
35
            return HttpResponse(json.dumps(geojson), content_type=content_type)
36
        return HttpResponseForbidden()
29
        cell = get_object_or_404(
30
            Map,
31
            pk=kwargs['cell_id'])
32
        layer = get_object_or_404(
33
            cell.layers.all(),
34
            kind='geojson',
35
            slug=kwargs['layer_slug'])
36
        if not cell.page.is_visible(request.user) or not cell.is_visible(request.user):
37
            return HttpResponseForbidden()
38
        geojson = layer.get_geojson(request)
39
        content_type = 'application/json'
40
        return HttpResponse(json.dumps(geojson), content_type=content_type)
tests/test_maps_cells.py
129 129
    MapLayer.objects.all().delete()
130 130
    assert Map.is_enabled() is False
131 131

  
132

  
132 133
def test_cell_enabled(layer):
133 134
    assert Map.is_enabled() is True
134 135

  
136

  
135 137
def test_cell_rendering(app, layer, tiles_layer):
136 138
    page = Page(title='xxx', slug='test_map_cell', template_name='standard')
137 139
    page.save()
138 140
    cell = Map(page=page, placeholder='content', order=0, title='Map with points')
139 141
    cell.save()
140
    options = MapLayerOptions.objects.create(map_cell=cell, map_layer=layer)
142
    MapLayerOptions.objects.create(map_cell=cell, map_layer=layer)
141 143
    context = {'request': RequestFactory().get('/')}
142 144
    rendered = cell.render(context)
143 145
    assert 'data-init-zoom="13"' in rendered
......
145 147
    assert 'data-max-zoom="19"' in rendered
146 148
    assert 'data-init-lat="48.83369263315934"' in rendered
147 149
    assert 'data-init-lng="2.3233688436448574"' in rendered
148
    assert 'data-geojson-url="/ajax/mapcell/geojson/1/"' in rendered
150
    assert '/ajax/mapcell/geojson/1/%s/' % layer.slug in rendered
149 151
    assert 'data-group-markers="1"' not in rendered
150 152
    resp = app.get('/test_map_cell/')
151 153
    assert 'xstatic/leaflet.js' in resp.text
......
214 216
    }]
215 217

  
216 218

  
219
def test_get_geojson_not_found(app, layer):
220
    page = Page.objects.create(title='xxx', slug='new', template_name='standard')
221
    cell = Map.objects.create(page=page, placeholder='content', order=0, title='Map with points')
222
    MapLayerOptions.objects.create(map_cell=cell, map_layer=layer)
223

  
224
    app.get(reverse('mapcell-geojson', kwargs={'cell_id': 0, 'layer_slug': layer.slug}), status=404)
225
    app.get(reverse('mapcell-geojson', kwargs={'cell_id': cell.pk, 'layer_slug': 'foo'}), status=404)
226

  
227

  
217 228
def test_get_geojson_on_non_public_page(app, layer):
218
    page = Page(title='xxx', slug='new', template_name='standard',
219
                public=False)
220
    page.save()
221
    cell = Map(page=page, placeholder='content', order=0,
222
                   title='Map with points')
223
    cell.save()
229
    page = Page.objects.create(title='xxx', slug='new', template_name='standard', public=False)
230
    cell = Map.objects.create(page=page, placeholder='content', order=0, title='Map with points')
224 231
    MapLayerOptions.objects.create(map_cell=cell, map_layer=layer)
225
    app.get(reverse('mapcell-geojson', kwargs={'cell_id': cell.id}), status=403)
232
    app.get(reverse('mapcell-geojson', kwargs={'cell_id': cell.id, 'layer_slug': layer.slug}), status=403)
233

  
226 234

  
227 235
def test_get_geojson_on_non_publik_cell(app, layer):
228
    page = Page(title='xxx', slug='new', template_name='standard')
229
    page.save()
230
    cell = Map(page=page, placeholder='content', order=0, public=False,
231
                   title='Map with points')
232
    cell.save()
236
    page = Page.objects.create(title='xxx', slug='new', template_name='standard')
237
    cell = Map.objects.create(page=page, placeholder='content', order=0, title='Map with points', public=False)
233 238
    MapLayerOptions.objects.create(map_cell=cell, map_layer=layer)
234
    app.get(reverse('mapcell-geojson', kwargs={'cell_id': cell.id}), status=403)
239
    app.get(reverse('mapcell-geojson', kwargs={'cell_id': cell.id, 'layer_slug': layer.slug}), status=403)
240

  
235 241

  
236 242
def test_geojson_on_restricted_cell(app, layer, user):
237
    page = Page(title='xxx', slug='new', template_name='standard')
238
    page.save()
243
    page = Page.objects.create(title='xxx', slug='new', template_name='standard')
239 244
    group = Group.objects.create(name='map tester')
240 245
    cell = Map(page=page, placeholder='content', order=0, public=False)
241
    cell.title = 'Map with points'
242
    cell.save()
246
    cell = Map.objects.create(page=page, placeholder='content', order=0, title='Map with points', public=False)
243 247
    MapLayerOptions.objects.create(map_cell=cell, map_layer=layer)
244 248
    cell.groups.add(group)
245 249
    login(app)
246
    app.get(reverse('mapcell-geojson', kwargs={'cell_id': cell.id}), status=403)
250
    app.get(reverse('mapcell-geojson', kwargs={'cell_id': cell.id, 'layer_slug': layer.slug}), status=403)
247 251
    user.groups.add(group)
248 252
    user.save()
249 253

  
......
252 256
                content=SAMPLE_GEOJSON_CONTENT,
253 257
                json=lambda: json.loads(SAMPLE_GEOJSON_CONTENT),
254 258
                status_code=200)
255
        resp = app.get(reverse('mapcell-geojson', kwargs={'cell_id': cell.id}))
259
        app.get(reverse('mapcell-geojson', kwargs={'cell_id': cell.id, 'layer_slug': layer.slug}))
260

  
256 261

  
257 262
def test_get_geojson(app, layer, user):
258 263
    page = Page(title='xxx', slug='new', template_name='standard')
......
264 269
    layer.save()
265 270
    MapLayerOptions.objects.create(map_cell=cell, map_layer=layer)
266 271

  
272
    geojson_url = reverse('mapcell-geojson', kwargs={'cell_id': cell.id, 'layer_slug': layer.slug})
273

  
267 274
    # check cache duration
268 275
    with mock.patch('combo.utils.requests_wrapper.RequestsSession.request') as requests_get:
269 276
        requests_get.return_value = mock.Mock(
270 277
                content=SAMPLE_GEOJSON_CONTENT,
271 278
                json=lambda: json.loads(SAMPLE_GEOJSON_CONTENT),
272 279
                status_code=200)
273
        resp = app.get(reverse('mapcell-geojson', kwargs={'cell_id': cell.id}))
280
        resp = app.get(geojson_url)
274 281
        assert len(json.loads(resp.text)['features']) == 2
275 282
        assert requests_get.call_count == 1
276
        resp = app.get(reverse('mapcell-geojson', kwargs={'cell_id': cell.id}))
277
        assert requests_get.call_count == 1 # cache was used
283
        resp = app.get(geojson_url)
284
        assert requests_get.call_count == 1  # cache was used
278 285
        layer.cache_duration = 0
279 286
        layer.save()
280
        resp = app.get(reverse('mapcell-geojson', kwargs={'cell_id': cell.id}))
281
        assert requests_get.call_count == 2 # cache was not used
287
        resp = app.get(geojson_url)
288
        assert requests_get.call_count == 2  # cache was not used
282 289

  
283 290
    # check user params
284 291
    layer.geojson_url = 'http://example.org/geojson?t2'
......
288 295
                content=SAMPLE_GEOJSON_CONTENT,
289 296
                json=lambda: json.loads(SAMPLE_GEOJSON_CONTENT),
290 297
                status_code=200)
291
        resp = app.get(reverse('mapcell-geojson', kwargs={'cell_id': cell.id}))
298
        resp = app.get(geojson_url)
292 299
        assert 'orig=combo' in requests_get.call_args[0][1]
293 300
        assert 'email=&' in requests_get.call_args[0][1]
294 301

  
......
300 307
                content=SAMPLE_GEOJSON_CONTENT,
301 308
                json=lambda: json.loads(SAMPLE_GEOJSON_CONTENT),
302 309
                status_code=200)
303
        resp = app.get(reverse('mapcell-geojson', kwargs={'cell_id': cell.id}))
310
        resp = app.get(geojson_url)
304 311
        assert 'orig=combo' in requests_get.call_args[0][1]
305 312
        assert 'email=admin%40localhost&' in requests_get.call_args[0][1]
306 313

  
......
312 319
                content=SAMPLE_GEOJSON_CONTENT,
313 320
                json=lambda: json.loads(SAMPLE_GEOJSON_CONTENT),
314 321
                status_code=200)
315
        resp = app.get(reverse('mapcell-geojson', kwargs={'cell_id': cell.id}))
322
        resp = app.get(geojson_url)
316 323
        assert 'orig=combo' in requests_get.call_args[0][1]
317
        assert not 'email=admin%40localhost&' in requests_get.call_args[0][1]
324
        assert 'email=admin%40localhost&' not in requests_get.call_args[0][1]
318 325

  
319 326
    # check query on geojson
320 327
    layer.geojson_url = 'http://example.org/geojson?t5'
......
325 332
                content=SAMPLE_GEOJSON_CONTENT,
326 333
                json=lambda: json.loads(SAMPLE_GEOJSON_CONTENT),
327 334
                status_code=200)
328
        resp = app.get(reverse('mapcell-geojson', kwargs={'cell_id': cell.id}) + '?q=bar')
335
        resp = app.get(geojson_url + '?q=bar')
329 336
        assert len(json.loads(resp.text)['features']) == 1
330 337
        assert 'orig=combo' in requests_get.call_args[0][1]
331
        assert not 'email=admin%40localhost&' in requests_get.call_args[0][1]
338
        assert 'email=admin%40localhost&' not in requests_get.call_args[0][1]
332 339

  
333 340
        # query against layer name
334
        resp = app.get(reverse('mapcell-geojson', kwargs={'cell_id': cell.id}) + '?q=bicycle')
341
        resp = app.get(geojson_url + '?q=bicycle')
335 342
        assert len(json.loads(resp.text)['features']) == 0
336 343

  
337 344
        # query against subproperty
338
        resp = app.get(reverse('mapcell-geojson', kwargs={'cell_id': cell.id}) + '?q=whatever')
345
        resp = app.get(geojson_url + '?q=whatever')
339 346
        assert len(json.loads(resp.text)['features']) == 1
340 347

  
341 348
    # check distance query on geojson
......
347 354
                content=SAMPLE_GEOJSON_CONTENT,
348 355
                json=lambda: json.loads(SAMPLE_GEOJSON_CONTENT),
349 356
                status_code=200)
350
        resp = app.get(reverse('mapcell-geojson', kwargs={'cell_id': cell.id}) + '?lng=2.54&lat=48.84&distance=2000')
357
        resp = app.get(geojson_url + '?lng=2.54&lat=48.84&distance=2000')
351 358
        assert len(json.loads(resp.text)['features']) == 2
352 359

  
353
        resp = app.get(reverse('mapcell-geojson', kwargs={'cell_id': cell.id}) + '?lng=2.54&lat=48.84&distance=1000')
360
        resp = app.get(geojson_url + '?lng=2.54&lat=48.84&distance=1000')
354 361
        assert len(json.loads(resp.text)['features']) == 1
355 362

  
356
        resp = app.get(reverse('mapcell-geojson', kwargs={'cell_id': cell.id}) + '?lng=2.54&lat=48.84&distance=100')
363
        resp = app.get(geojson_url + '?lng=2.54&lat=48.84&distance=100')
357 364
        assert len(json.loads(resp.text)['features']) == 0
358 365

  
359 366
    # check on multiple words
......
362 369
                content=SAMPLE_GEOJSON_CONTENT,
363 370
                json=lambda: json.loads(SAMPLE_GEOJSON_CONTENT),
364 371
                status_code=200)
365
        resp = app.get(reverse('mapcell-geojson', kwargs={'cell_id': cell.id}) + '?q=bar baz')
372
        resp = app.get(geojson_url + '?q=bar baz')
366 373
        assert len(json.loads(resp.text)['features']) == 1
367 374

  
368
        resp = app.get(reverse('mapcell-geojson', kwargs={'cell_id': cell.id}) + '?q=quux baz')
375
        resp = app.get(geojson_url + '?q=quux baz')
369 376
        assert len(json.loads(resp.text)['features']) == 0
370 377

  
371 378
    # add a second layer
......
377 384
    layer2.icon_colour = '0000FF'
378 385
    layer2.save()
379 386
    MapLayerOptions.objects.create(map_cell=cell, map_layer=layer2)
387
    geojson_url2 = reverse('mapcell-geojson', kwargs={'cell_id': cell.id, 'layer_slug': layer2.slug})
380 388

  
381 389
    with mock.patch('combo.utils.requests_wrapper.RequestsSession.request') as requests_get:
382 390
        requests_get.return_value = mock.Mock(
383 391
                content=SAMPLE_GEOJSON_CONTENT,
384 392
                json=lambda: json.loads(SAMPLE_GEOJSON_CONTENT),
385 393
                status_code=200)
386
        resp = app.get(reverse('mapcell-geojson', kwargs={'cell_id': cell.id}) + '?q=bar')
387
        assert len(json.loads(resp.text)['features']) == 2
388

  
389
        resp = app.get(reverse('mapcell-geojson', kwargs={'cell_id': cell.id}) + '?q=xyz')
390
        assert len(json.loads(resp.text)['features']) == 0
391

  
392
        # query against layer name, it should get results
393
        resp = app.get(reverse('mapcell-geojson', kwargs={'cell_id': cell.id}) + '?q=bicycle')
394
        assert len(json.loads(resp.text)['features']) == 2
395

  
396
        resp = app.get(reverse('mapcell-geojson', kwargs={'cell_id': cell.id}) + '?q=bar bicycle')
394
        resp = app.get(geojson_url + '?q=bar')
395
        assert len(json.loads(resp.text)['features']) == 1
396
        resp = app.get(geojson_url2 + '?q=bar')
397 397
        assert len(json.loads(resp.text)['features']) == 1
398 398

  
399
        resp = app.get(reverse('mapcell-geojson', kwargs={'cell_id': cell.id}) + '?q=quux bicycle')
399
        resp = app.get(geojson_url + '?q=xyz')
400
        assert len(json.loads(resp.text)['features']) == 0
401
        resp = app.get(geojson_url2 + '?q=xyz')
400 402
        assert len(json.loads(resp.text)['features']) == 0
401 403

  
402 404

  
......
416 418
                content=SAMPLE_GEOJSON_CONTENT,
417 419
                json=lambda: json.loads(SAMPLE_GEOJSON_CONTENT),
418 420
                status_code=200)
419
        resp = app.get(reverse('mapcell-geojson', kwargs={'cell_id': cell.id}))
421
        resp = app.get(reverse('mapcell-geojson', kwargs={'cell_id': cell.id, 'layer_slug': layer.slug}))
420 422
        features = json.loads(resp.text)['features']
421 423
        assert 'name' in features[0]['properties']
422 424
        assert 'extra' in features[0]['properties']
......
430 432
                content=SAMPLE_GEOJSON_CONTENT,
431 433
                json=lambda: json.loads(SAMPLE_GEOJSON_CONTENT),
432 434
                status_code=200)
433
        resp = app.get(reverse('mapcell-geojson', kwargs={'cell_id': cell.id}))
435
        resp = app.get(reverse('mapcell-geojson', kwargs={'cell_id': cell.id, 'layer_slug': layer.slug}))
434 436
        features = json.loads(resp.text)['features']
435 437
        assert 'name' in features[0]['properties']
436 438
        assert 'extra' not in features[0]['properties']
......
444 446
                content=SAMPLE_WCS_GEOJSON_CONTENT,
445 447
                json=lambda: json.loads(SAMPLE_WCS_GEOJSON_CONTENT),
446 448
                status_code=200)
447
        resp = app.get(reverse('mapcell-geojson', kwargs={'cell_id': cell.id}))
449
        resp = app.get(reverse('mapcell-geojson', kwargs={'cell_id': cell.id, 'layer_slug': layer.slug}))
448 450
        features = json.loads(resp.text)['features']
449 451
        assert len(features[0]['properties']['display_fields']) == 2
450 452
        assert features[0]['properties']['layer']['properties'] == []
......
457 459
                content=SAMPLE_WCS_GEOJSON_CONTENT,
458 460
                json=lambda: json.loads(SAMPLE_WCS_GEOJSON_CONTENT),
459 461
                status_code=200)
460
        resp = app.get(reverse('mapcell-geojson', kwargs={'cell_id': cell.id}))
462
        resp = app.get(reverse('mapcell-geojson', kwargs={'cell_id': cell.id, 'layer_slug': layer.slug}))
461 463
        features = json.loads(resp.text)['features']
462 464
        assert len(features[0]['properties']['display_fields']) == 1
463 465
        assert features[0]['properties']['layer']['properties'] == ['id']
tests/test_maps_manager.py
186 186
                        'properties': {'property': 'property value'}}]
187 187
    mocked_response.ok.return_value = True
188 188
    mock_request.return_value = mocked_response
189
    geojson = layer.get_geojson(mock_request)
189
    geojson = layer.get_geojson(mock_request)['features']
190 190
    assert len(geojson) > 0
191 191
    for item in geojson:
192 192
        assert item['type'] == 'Feature'
......
207 207
    }
208 208
    mocked_response.ok.return_value = True
209 209
    mock_request.return_value = mocked_response
210
    geojson = layer.get_geojson(mock_request)
210
    geojson = layer.get_geojson(mock_request)['features']
211 211
    assert len(geojson) > 0
212 212
    for item in geojson:
213 213
        assert item['geometry']['type'] == 'Point'
214
-