change short urls to not rely on doule slashes

This commit is contained in:
Laura Klünder 2017-10-31 18:35:42 +01:00
parent 31bc299f77
commit 94a23454a1
4 changed files with 29 additions and 15 deletions

View file

@ -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]: 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) cache_key = 'mapdata:location:by_slug:%s:%s' % (AccessPermission.cache_key_for_request(request), slug)
locations = cache.get(cache_key, None) location = cache.get(cache_key, None)
if locations is not None: if location is not None:
return locations return location
if ':' in slug: if ':' in slug:
code, pk = slug.split(':', 1) 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) cache.set(cache_key, location, 300)
return locations return location

View file

@ -107,7 +107,11 @@ c3nav = {
var url; var url;
if (state.routing) { 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 { } else {
url = state.destination?('/l/'+state.destination.slug+'/'):'/'; url = state.destination?('/l/'+state.destination.slug+'/'):'/';
} }

View file

@ -5,7 +5,8 @@ from c3nav.site.views import map_index
pos = r'(@(?P<level>[a-z0-9-_:]+),(?P<x>-?\d+(\.\d+)?),(?P<y>-?\d+(\.\d+)?),(?P<zoom>-?\d+(\.\d+)?))?' pos = r'(@(?P<level>[a-z0-9-_:]+),(?P<x>-?\d+(\.\d+)?),(?P<y>-?\d+(\.\d+)?),(?P<zoom>-?\d+(\.\d+)?))?'
urlpatterns = [ urlpatterns = [
url(r'^r/(?P<origin>([a-z0-9-_:]+)?)/(?P<destination>([a-z0-9-_:]+)?)/%s$' % pos, map_index, name='site.index'), url(r'^(?P<mode>[lod])/(?P<slug>[a-z0-9-_:]+)/%s$' % pos, map_index, name='site.index'),
url(r'^l/(?P<destination>[a-z0-9-_:]+)/%s$' % pos, map_index, name='site.index'), url(r'^r/(?P<slug>[a-z0-9-_:]+)/(?P<slug2>[a-z0-9-_:]+)/%s$' % pos, map_index, name='site.index'),
url(r'^(?P<mode>r)/%s$' % pos, map_index, name='site.index'),
url(r'^%s$' % pos, map_index, name='site.index') url(r'^%s$' % pos, map_index, name='site.index')
] ]

View file

@ -72,7 +72,7 @@ def check_location(location: Optional[str], request) -> Optional[SpecificLocatio
location = get_location_by_slug_for_request(location, request) location = get_location_by_slug_for_request(location, request)
if location is None: if location is None:
return return None
if isinstance(location, LocationRedirect): if isinstance(location, LocationRedirect):
location: Location = location.target location: Location = location.target
@ -99,21 +99,30 @@ def get_levels(request) -> Mapping[int, Level]:
return levels 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) levels = Level.qs_for_request(request).filter(on_top_of_id__isnull=True)
origin_slug, destination_slug = origin, destination origin = None
destination = None
origin = check_location(origin or None, request) routing = False
destination = check_location(destination or None, request) 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 = { state = {
'routing': origin_slug is not None, 'routing': routing,
'origin': (origin.serialize(detailed=False, simple_geometry=True, geometry=False) 'origin': (origin.serialize(detailed=False, simple_geometry=True, geometry=False)
if origin else None), if origin else None),
'destination': (destination.serialize(detailed=False, simple_geometry=True, geometry=False) 'destination': (destination.serialize(detailed=False, simple_geometry=True, geometry=False)
if destination else None), 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) levels_cache_key = 'mapdata:levels:%s' % AccessPermission.cache_key_for_request(request)