levels_by_short_label_for_request

This commit is contained in:
Laura Klünder 2017-11-28 20:24:39 +01:00
parent dc46173668
commit 9b2b70f46f
2 changed files with 19 additions and 10 deletions

View file

@ -158,6 +158,22 @@ def locations_by_slug_for_request(request) -> Mapping[str, LocationSlug]:
return locations 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): def get_location_by_id_for_request(pk, request):
if isinstance(pk, str): if isinstance(pk, str):
if pk.isdigit(): if pk.isdigit():
@ -203,7 +219,7 @@ def get_custom_location_for_request(slug: str, request):
match = re.match(r'^c:(?P<level>[a-z0-9-_]+):(?P<x>-?\d+(\.\d\d?)?):(?P<y>-?\d+(\.\d\d?)?)$', slug) match = re.match(r'^c:(?P<level>[a-z0-9-_]+):(?P<x>-?\d+(\.\d\d?)?):(?P<y>-?\d+(\.\d\d?)?)$', slug)
if match is None: if match is None:
return 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): if not isinstance(level, Level):
return None return None
return CustomLocation(level, float(match.group('x')), float(match.group('y'))) return CustomLocation(level, float(match.group('x')), float(match.group('y')))

View file

@ -14,7 +14,7 @@ from c3nav.mapdata.models import Location, Source
from c3nav.mapdata.models.access import AccessPermission from c3nav.mapdata.models.access import AccessPermission
from c3nav.mapdata.models.level import Level from c3nav.mapdata.models.level import Level
from c3nav.mapdata.models.locations import LocationRedirect, SpecificLocation 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 from c3nav.mapdata.views import set_tile_access_cookie
ctype_mapping = { 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, 'details': True if details else False,
} }
levels_cache_key = 'mapdata:levels:%s' % AccessPermission.cache_key_for_request(request) levels = levels_by_short_label_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)
level = levels.get(level, None) if level else None level = levels.get(level, None) if level else None
if level is not None: if level is not None: