From 94a23454a163384652cd5f98e72e1fd3f0ec2e8a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Laura=20Kl=C3=BCnder?= Date: Tue, 31 Oct 2017 18:35:42 +0100 Subject: [PATCH] change short urls to not rely on doule slashes --- src/c3nav/mapdata/utils/locations.py | 8 ++++---- src/c3nav/site/static/site/js/c3nav.js | 6 +++++- src/c3nav/site/urls.py | 5 +++-- src/c3nav/site/views.py | 25 +++++++++++++++++-------- 4 files changed, 29 insertions(+), 15 deletions(-) diff --git a/src/c3nav/mapdata/utils/locations.py b/src/c3nav/mapdata/utils/locations.py index 9e38e203..fe82fc8e 100644 --- a/src/c3nav/mapdata/utils/locations.py +++ b/src/c3nav/mapdata/utils/locations.py @@ -129,9 +129,9 @@ def locations_by_slug_for_request(request) -> Mapping[str, LocationSlug]: def get_location_by_slug_for_request(slug: str, request) -> Optional[LocationSlug]: cache_key = 'mapdata:location:by_slug:%s:%s' % (AccessPermission.cache_key_for_request(request), slug) - locations = cache.get(cache_key, None) - if locations is not None: - return locations + location = cache.get(cache_key, None) + if location is not None: + return location if ':' in slug: code, pk = slug.split(':', 1) @@ -152,4 +152,4 @@ def get_location_by_slug_for_request(slug: str, request) -> Optional[LocationSlu cache.set(cache_key, location, 300) - return locations + return location diff --git a/src/c3nav/site/static/site/js/c3nav.js b/src/c3nav/site/static/site/js/c3nav.js index f53cadbb..8d1efd0a 100644 --- a/src/c3nav/site/static/site/js/c3nav.js +++ b/src/c3nav/site/static/site/js/c3nav.js @@ -107,7 +107,11 @@ c3nav = { var url; if (state.routing) { - url = '/r/'+(state.origin?state.origin.slug:'')+'/'+(state.destination?state.destination.slug:'')+'/'; + if (state.origin) { + url = (state.destination) ? '/r/'+state.origin.slug+'/'+state.destination.slug+'/' : '/o/'+state.origin.slug+'/'; + } else { + url = (state.destination) ? '/d/'+state.destination.slug+'/' : '/r/'; + } } else { url = state.destination?('/l/'+state.destination.slug+'/'):'/'; } diff --git a/src/c3nav/site/urls.py b/src/c3nav/site/urls.py index 53eeacc3..86fd93bf 100644 --- a/src/c3nav/site/urls.py +++ b/src/c3nav/site/urls.py @@ -5,7 +5,8 @@ from c3nav.site.views import map_index pos = r'(@(?P[a-z0-9-_:]+),(?P-?\d+(\.\d+)?),(?P-?\d+(\.\d+)?),(?P-?\d+(\.\d+)?))?' urlpatterns = [ - url(r'^r/(?P([a-z0-9-_:]+)?)/(?P([a-z0-9-_:]+)?)/%s$' % pos, map_index, name='site.index'), - url(r'^l/(?P[a-z0-9-_:]+)/%s$' % pos, map_index, name='site.index'), + url(r'^(?P[lod])/(?P[a-z0-9-_:]+)/%s$' % pos, map_index, name='site.index'), + url(r'^r/(?P[a-z0-9-_:]+)/(?P[a-z0-9-_:]+)/%s$' % pos, map_index, name='site.index'), + url(r'^(?Pr)/%s$' % pos, map_index, name='site.index'), url(r'^%s$' % pos, map_index, name='site.index') ] diff --git a/src/c3nav/site/views.py b/src/c3nav/site/views.py index 6cf13e85..3a1d90ca 100644 --- a/src/c3nav/site/views.py +++ b/src/c3nav/site/views.py @@ -72,7 +72,7 @@ def check_location(location: Optional[str], request) -> Optional[SpecificLocatio location = get_location_by_slug_for_request(location, request) if location is None: - return + return None if isinstance(location, LocationRedirect): location: Location = location.target @@ -99,21 +99,30 @@ def get_levels(request) -> Mapping[int, Level]: return levels -def map_index(request, origin=None, destination=None, level=None, x=None, y=None, zoom=None): +def map_index(request, mode=None, slug=None, slug2=None, level=None, x=None, y=None, zoom=None): levels = Level.qs_for_request(request).filter(on_top_of_id__isnull=True) - origin_slug, destination_slug = origin, destination - - origin = check_location(origin or None, request) - destination = check_location(destination or None, request) + origin = None + destination = None + routing = False + if slug2 is not None: + routing = True + origin = check_location(slug, request) + destination = check_location(slug2, request) + else: + routing = (mode and mode != 'l') + if mode == 'o': + origin = check_location(slug, request) + else: + destination = check_location(slug, request) state = { - 'routing': origin_slug is not None, + 'routing': routing, 'origin': (origin.serialize(detailed=False, simple_geometry=True, geometry=False) if origin else None), 'destination': (destination.serialize(detailed=False, simple_geometry=True, geometry=False) if destination else None), - 'sidebar': destination_slug is not None, + 'sidebar': routing or destination is not None, } levels_cache_key = 'mapdata:levels:%s' % AccessPermission.cache_key_for_request(request)