maps: add cache/user id configuration knobs to layers (#16678)
This commit is contained in:
parent
6b070a1fc4
commit
c8ce46abd0
|
@ -0,0 +1,24 @@
|
|||
# -*- coding: utf-8 -*-
|
||||
from __future__ import unicode_literals
|
||||
|
||||
from django.db import migrations, models
|
||||
|
||||
|
||||
class Migration(migrations.Migration):
|
||||
|
||||
dependencies = [
|
||||
('maps', '0002_map'),
|
||||
]
|
||||
|
||||
operations = [
|
||||
migrations.AddField(
|
||||
model_name='maplayer',
|
||||
name='cache_duration',
|
||||
field=models.PositiveIntegerField(default=60, verbose_name='Cache duration'),
|
||||
),
|
||||
migrations.AddField(
|
||||
model_name='maplayer',
|
||||
name='include_user_identifier',
|
||||
field=models.BooleanField(default=True, verbose_name='Include user identifier in request'),
|
||||
),
|
||||
]
|
|
@ -61,6 +61,10 @@ class MapLayer(models.Model):
|
|||
icon = models.CharField(_('Marker icon'), max_length=32, blank=True, null=True,
|
||||
choices=ICONS)
|
||||
icon_colour = models.CharField(_('Icon colour'), max_length=7, default='#FFFFFF')
|
||||
cache_duration = models.PositiveIntegerField(_('Cache duration'), default=60)
|
||||
include_user_identifier = models.BooleanField(
|
||||
_('Include user identifier in request'),
|
||||
default=True)
|
||||
|
||||
def save(self, *args, **kwargs):
|
||||
if not self.slug:
|
||||
|
@ -83,7 +87,9 @@ class MapLayer(models.Model):
|
|||
def get_geojson(self, request):
|
||||
response = requests.get(self.geojson_url,
|
||||
remote_service='auto',
|
||||
user=request.user,
|
||||
cache_duration=self.cache_duration,
|
||||
user=request.user if self.include_user_identifier else None,
|
||||
without_user=not(self.include_user_identifier),
|
||||
headers={'accept': 'application/json'})
|
||||
if not response.ok:
|
||||
return []
|
||||
|
|
|
@ -1,4 +1,6 @@
|
|||
# -*- coding: utf-8 -*-
|
||||
import json
|
||||
import mock
|
||||
import pytest
|
||||
|
||||
from django.contrib.auth.models import User
|
||||
|
@ -15,12 +17,29 @@ pytestmark = pytest.mark.django_db
|
|||
|
||||
client = Client()
|
||||
|
||||
SAMPLE_GEOJSON_CONTENT = '''{
|
||||
"type": "FeatureCollection",
|
||||
"features": [
|
||||
{
|
||||
"type": "Feature",
|
||||
"properties": {},
|
||||
"geometry": {
|
||||
"type": "Point",
|
||||
"coordinates": [
|
||||
2.548828125,
|
||||
48.83579746243093
|
||||
]
|
||||
}
|
||||
}
|
||||
]
|
||||
}'''
|
||||
|
||||
@pytest.fixture
|
||||
def user():
|
||||
try:
|
||||
user = User.objects.get(username='admin')
|
||||
except User.DoesNotExist:
|
||||
user = User.objects.create_user('admin', email=None, password='admin')
|
||||
user = User.objects.create_user('admin', email='admin@localhost', password='admin')
|
||||
return user
|
||||
|
||||
@pytest.fixture
|
||||
|
@ -29,7 +48,7 @@ def layer():
|
|||
layer = MapLayer.objects.get()
|
||||
except MapLayer.DoesNotExist:
|
||||
layer = MapLayer()
|
||||
layer.geojson_url = 'http://example.net/geojson'
|
||||
layer.geojson_url = 'http://example.org/geojson'
|
||||
layer.marker_colour = 'FF0000'
|
||||
layer.icon = 'fa-bicycle'
|
||||
layer.icon_colour = '0000FF'
|
||||
|
@ -103,4 +122,71 @@ def test_geojson_on_restricted_cell(layer, user):
|
|||
assert resp.status_code == 403
|
||||
user.groups.add(group)
|
||||
user.save()
|
||||
resp = client.get(reverse('mapcell-geojson', kwargs={'cell_id': cell.id}))
|
||||
|
||||
with mock.patch('combo.utils.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 = client.get(reverse('mapcell-geojson', kwargs={'cell_id': cell.id}))
|
||||
|
||||
def test_get_geojson(layer, user):
|
||||
page = Page(title='xxx', slug='new', template_name='standard')
|
||||
page.save()
|
||||
cell = Map(page=page, placeholder='content', order=0, public=True)
|
||||
cell.title = 'Map'
|
||||
cell.save()
|
||||
layer.geojson_url = 'http://example.org/geojson?t1'
|
||||
layer.save()
|
||||
cell.layers.add(layer)
|
||||
|
||||
# check cache duration
|
||||
with mock.patch('combo.utils.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 = client.get(reverse('mapcell-geojson', kwargs={'cell_id': cell.id}))
|
||||
assert requests_get.call_count == 1
|
||||
resp = client.get(reverse('mapcell-geojson', kwargs={'cell_id': cell.id}))
|
||||
assert requests_get.call_count == 1 # cache was used
|
||||
layer.cache_duration = 0
|
||||
layer.save()
|
||||
resp = client.get(reverse('mapcell-geojson', kwargs={'cell_id': cell.id}))
|
||||
assert requests_get.call_count == 2 # cache was not used
|
||||
|
||||
# check user params
|
||||
layer.geojson_url = 'http://example.org/geojson?t2'
|
||||
layer.save()
|
||||
with mock.patch('combo.utils.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 = client.get(reverse('mapcell-geojson', kwargs={'cell_id': cell.id}))
|
||||
assert 'orig=combo' in requests_get.call_args[0][1]
|
||||
assert 'email=&' in requests_get.call_args[0][1]
|
||||
|
||||
login()
|
||||
layer.geojson_url = 'http://example.org/geojson?t3'
|
||||
layer.save()
|
||||
with mock.patch('combo.utils.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 = client.get(reverse('mapcell-geojson', kwargs={'cell_id': cell.id}))
|
||||
assert 'orig=combo' in requests_get.call_args[0][1]
|
||||
assert 'email=admin%40localhost&' in requests_get.call_args[0][1]
|
||||
|
||||
layer.geojson_url = 'http://example.org/geojson?t4'
|
||||
layer.include_user_identifier = False
|
||||
layer.save()
|
||||
with mock.patch('combo.utils.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 = client.get(reverse('mapcell-geojson', kwargs={'cell_id': cell.id}))
|
||||
assert 'orig=combo' in requests_get.call_args[0][1]
|
||||
assert not 'email=admin%40localhost&' in requests_get.call_args[0][1]
|
||||
|
|
Loading…
Reference in New Issue