update tile access cookie setting infrastructure

This commit is contained in:
Laura Klünder 2017-12-04 17:24:01 +01:00
parent d4a0a9b7dd
commit 1169597800
6 changed files with 24 additions and 32 deletions

View file

@ -37,7 +37,7 @@ router.register(r'locations/by_slug', LocationBySlugViewSet, base_name='location
router.register(r'locationgroupcategories', LocationGroupCategoryViewSet)
router.register(r'locationgroups', LocationGroupViewSet)
router.register(r'user', UserViewSet, base_name='user')
router.register(r'users', UserViewSet, base_name='users')
router.register(r'routing', RoutingViewSet, base_name='routing')

View file

@ -28,6 +28,7 @@ from c3nav.mapdata.utils.locations import (get_location_by_id_for_request, get_l
searchable_locations_for_request, visible_locations_for_request)
from c3nav.mapdata.utils.models import get_submodels
from c3nav.mapdata.utils.user import get_user_data
from c3nav.mapdata.views import set_tile_access_cookie
def optimize_query(qs):
@ -381,7 +382,13 @@ class AccessRestrictionViewSet(MapdataViewSet):
queryset = AccessRestriction.objects.all()
class UserViewSet(MapdataViewSet):
class UserViewSet(GenericViewSet):
"""
Get display information about the current user. This endpoint also sets the tile access cookie.
The tile access cookie is only valid for 1 minute, so if you are displaying a map, call this endpoint repeatedly.
"""
@list_route(methods=['get'])
def current(self, request, key=None):
return Response(get_user_data(request))
response = Response(get_user_data(request))
set_tile_access_cookie(request, response)
return response

View file

@ -1,6 +1,6 @@
from django.conf.urls import url
from c3nav.mapdata.views import get_cache_package, map_history, tile, tile_access
from c3nav.mapdata.views import get_cache_package, map_history, tile
urlpatterns = [
url(r'^(?P<level>\d+)/(?P<zoom>-?\d+)/(?P<x>-?\d+)/(?P<y>-?\d+).png$', tile, name='mapdata.tile'),
@ -9,5 +9,4 @@ urlpatterns = [
url(r'^history/(?P<level>\d+)/(?P<mode>base|composite)\.(?P<filetype>png|data)$', map_history,
name='mapdata.map_history'),
url(r'^cache/package\.(?P<filetype>tar|tar\.gz|tar\.xz)$', get_cache_package, name='mapdata.cache_package'),
url(r'^tile_access$', tile_access, name='mapdata.tile_access'),
]

View file

@ -1,6 +1,5 @@
import base64
import os
from functools import wraps
from wsgiref.util import FileWrapper
from django.conf import settings
@ -20,21 +19,15 @@ from c3nav.mapdata.utils.tiles import (build_access_cache_key, build_base_cache_
build_tile_etag, get_tile_bounds, parse_tile_access_cookie)
def set_tile_access_cookie(func):
@wraps(func)
def wrapper(request, *args, **kwargs):
response = func(request, *args, **kwargs)
access_permissions = AccessPermission.get_for_request(request)
if access_permissions:
cookie = build_tile_access_cookie(access_permissions, settings.SECRET_TILE_KEY)
response.set_cookie(settings.TILE_ACCESS_COOKIE_NAME, cookie, max_age=60,
domain=settings.TILE_ACCESS_COOKIE_DOMAIN)
else:
response.delete_cookie(settings.TILE_ACCESS_COOKIE_NAME)
return response
return wrapper
def set_tile_access_cookie(request, response):
access_permissions = AccessPermission.get_for_request(request)
if access_permissions:
cookie = build_tile_access_cookie(access_permissions, settings.SECRET_TILE_KEY)
response.set_cookie(settings.TILE_ACCESS_COOKIE_NAME, cookie, max_age=60,
domain=settings.TILE_ACCESS_COOKIE_DOMAIN)
else:
response.delete_cookie(settings.TILE_ACCESS_COOKIE_NAME)
response['Cache-Control'] = 'no-cache'
encoded_tile_secret = base64.b64encode(settings.SECRET_TILE_KEY.encode()).decode()
@ -145,14 +138,6 @@ def tile(request, level, zoom, x, y, access_permissions=None):
return response
@no_language()
@set_tile_access_cookie
def tile_access(request):
response = HttpResponse(content_type='text/plain')
response['Cache-Control'] = 'no-cache'
return response
@etag(lambda *args, **kwargs: MapUpdate.current_processed_cache_key())
@no_language()
def map_history(request, level, mode, filetype):

View file

@ -855,7 +855,7 @@ c3nav = {
window.setTimeout(c3nav.refresh_tile_access, 16000);
},
refresh_tile_access: function () {
$.ajax('/map/tile_access');
$.ajax('/api/users/current/');
c3nav.schedule_refresh_tile_access();
}
};

View file

@ -35,7 +35,6 @@ def check_location(location: Optional[str], request) -> Optional[SpecificLocatio
return location
@set_tile_access_cookie
def map_index(request, mode=None, slug=None, slug2=None, details=None, level=None, x=None, y=None, zoom=None):
origin = None
destination = None
@ -78,7 +77,9 @@ def map_index(request, mode=None, slug=None, slug2=None, details=None, level=Non
'tile_cache_server': settings.TILE_CACHE_SERVER,
'user_data': get_user_data(request),
}
return render(request, 'site/map.html', ctx)
response = render(request, 'site/map.html', ctx)
set_tile_access_cookie(request, response)
return response
def qr_code_etag(request, path):