diff --git a/src/c3nav/mapdata/utils/locations.py b/src/c3nav/mapdata/utils/locations.py index 4441671e..9201bb69 100644 --- a/src/c3nav/mapdata/utils/locations.py +++ b/src/c3nav/mapdata/utils/locations.py @@ -158,6 +158,22 @@ def locations_by_slug_for_request(request) -> Mapping[str, LocationSlug]: return locations +def levels_by_short_label_for_request(request) -> Mapping[str, LocationSlug]: + cache_key = 'mapdata:levels:by_short_label:%s' % AccessPermission.cache_key_for_request(request) + levels = cache.get(cache_key, None) + if levels is not None: + return levels + + levels = OrderedDict( + (level.short_label, level) + for level in Level.qs_for_request(request).filter(on_top_of_id__isnull=True).order_by('base_altitude') + ) + + cache.set(cache_key, levels, 300) + + return levels + + def get_location_by_id_for_request(pk, request): if isinstance(pk, str): if pk.isdigit(): @@ -203,7 +219,7 @@ def get_custom_location_for_request(slug: str, request): match = re.match(r'^c:(?P[a-z0-9-_]+):(?P-?\d+(\.\d\d?)?):(?P-?\d+(\.\d\d?)?)$', slug) if match is None: return None - level = locations_by_slug_for_request(request).get(match.group('level')) + level = levels_by_short_label_for_request(request).get(match.group('level')) if not isinstance(level, Level): return None return CustomLocation(level, float(match.group('x')), float(match.group('y'))) diff --git a/src/c3nav/site/views.py b/src/c3nav/site/views.py index 3c126505..13599f5f 100644 --- a/src/c3nav/site/views.py +++ b/src/c3nav/site/views.py @@ -14,7 +14,7 @@ from c3nav.mapdata.models import Location, Source from c3nav.mapdata.models.access import AccessPermission from c3nav.mapdata.models.level import Level from c3nav.mapdata.models.locations import LocationRedirect, SpecificLocation -from c3nav.mapdata.utils.locations import get_location_by_slug_for_request +from c3nav.mapdata.utils.locations import get_location_by_slug_for_request, levels_by_short_label_for_request from c3nav.mapdata.views import set_tile_access_cookie ctype_mapping = { @@ -110,14 +110,7 @@ def map_index(request, mode=None, slug=None, slug2=None, details=None, level=Non 'details': True if details else False, } - levels_cache_key = 'mapdata:levels:%s' % AccessPermission.cache_key_for_request(request) - levels = cache.get(levels_cache_key, None) - if levels is None: - levels = OrderedDict( - (level.slug, (level.pk, level.slug, level.short_label)) - for level in Level.qs_for_request(request).filter(on_top_of_id__isnull=True).order_by('base_altitude') - ) - cache.set(levels_cache_key, levels, 300) + levels = levels_by_short_label_for_request(request) level = levels.get(level, None) if level else None if level is not None: