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

View file

@ -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+'/'):'/';
}

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+)?))?'
urlpatterns = [
url(r'^r/(?P<origin>([a-z0-9-_:]+)?)/(?P<destination>([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'^(?P<mode>[lod])/(?P<slug>[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')
]

View file

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