maps: add cache/user id configuration knobs to layers (#16678)

This commit is contained in:
Frédéric Péters 2017-06-03 16:54:14 +02:00
parent 6b070a1fc4
commit c8ce46abd0
3 changed files with 120 additions and 4 deletions

View File

@ -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'),
),
]

View File

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

View File

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