represent level in state url as short_label, not its id
This commit is contained in:
parent
3294704aee
commit
e98c38e5fb
4 changed files with 45 additions and 13 deletions
|
@ -30,7 +30,7 @@ class Level(SpecificLocation, models.Model):
|
||||||
default_height = models.DecimalField(_('default space height'), max_digits=6, decimal_places=2, default=3.0)
|
default_height = models.DecimalField(_('default space height'), max_digits=6, decimal_places=2, default=3.0)
|
||||||
on_top_of = models.ForeignKey('mapdata.Level', null=True, on_delete=models.CASCADE,
|
on_top_of = models.ForeignKey('mapdata.Level', null=True, on_delete=models.CASCADE,
|
||||||
related_name='levels_on_top', verbose_name=_('on top of'))
|
related_name='levels_on_top', verbose_name=_('on top of'))
|
||||||
short_label = models.CharField(max_length=20, verbose_name=_('short label'), unique=True)
|
short_label = models.SlugField(max_length=20, verbose_name=_('short label'), unique=True)
|
||||||
|
|
||||||
render_data = models.BinaryField(null=True)
|
render_data = models.BinaryField(null=True)
|
||||||
|
|
||||||
|
|
|
@ -63,7 +63,7 @@ c3nav = {
|
||||||
},
|
},
|
||||||
update_map_state: function (replace, level, center, zoom) {
|
update_map_state: function (replace, level, center, zoom) {
|
||||||
var new_state = {
|
var new_state = {
|
||||||
level: center ? level : c3nav._levelControl.currentLevel,
|
level: c3nav.level_labels_by_id[center ? level : c3nav._levelControl.currentLevel],
|
||||||
center: L.GeoJSON.latLngToCoords(center ? center : c3nav.map.getCenter(), 2),
|
center: L.GeoJSON.latLngToCoords(center ? center : c3nav.map.getCenter(), 2),
|
||||||
zoom: Math.round((center ? zoom : c3nav.map.getZoom()) * 100) / 100
|
zoom: Math.round((center ? zoom : c3nav.map.getZoom()) * 100) / 100
|
||||||
};
|
};
|
||||||
|
@ -399,10 +399,15 @@ c3nav = {
|
||||||
|
|
||||||
// map
|
// map
|
||||||
init_map: function () {
|
init_map: function () {
|
||||||
var $map = $('#map');
|
var $map = $('#map'), i;
|
||||||
c3nav.bounds = JSON.parse($map.attr('data-bounds'));
|
c3nav.bounds = JSON.parse($map.attr('data-bounds'));
|
||||||
c3nav.levels = JSON.parse($map.attr('data-levels'));
|
c3nav.levels = JSON.parse($map.attr('data-levels'));
|
||||||
|
|
||||||
|
c3nav.level_labels_by_id = {};
|
||||||
|
for (i = 0; i < c3nav.levels.length; i ++) {
|
||||||
|
c3nav.level_labels_by_id[c3nav.levels[i][0]] = c3nav.levels[i][1];
|
||||||
|
}
|
||||||
|
|
||||||
// create leaflet map
|
// create leaflet map
|
||||||
c3nav.map = L.map('map', {
|
c3nav.map = L.map('map', {
|
||||||
renderer: L.svg({padding: 2}),
|
renderer: L.svg({padding: 2}),
|
||||||
|
@ -432,9 +437,9 @@ c3nav = {
|
||||||
c3nav._locationLayers = {};
|
c3nav._locationLayers = {};
|
||||||
c3nav._locationLayerBounds = {};
|
c3nav._locationLayerBounds = {};
|
||||||
c3nav._routeLayers = {};
|
c3nav._routeLayers = {};
|
||||||
for (var i = c3nav.levels.length - 1; i >= 0; i--) {
|
for (i = c3nav.levels.length - 1; i >= 0; i--) {
|
||||||
var level = c3nav.levels[i];
|
var level = c3nav.levels[i];
|
||||||
var layerGroup = c3nav._levelControl.addLevel(level[0], level[1]);
|
var layerGroup = c3nav._levelControl.addLevel(level[0], level[2]);
|
||||||
c3nav._locationLayers[level[0]] = L.layerGroup().addTo(layerGroup);
|
c3nav._locationLayers[level[0]] = L.layerGroup().addTo(layerGroup);
|
||||||
c3nav._routeLayers[level[0]] = L.layerGroup().addTo(layerGroup);
|
c3nav._routeLayers[level[0]] = L.layerGroup().addTo(layerGroup);
|
||||||
}
|
}
|
||||||
|
|
|
@ -2,7 +2,7 @@ from django.conf.urls import url
|
||||||
|
|
||||||
from c3nav.site.views import map_index
|
from c3nav.site.views import map_index
|
||||||
|
|
||||||
pos = r'(@(?P<level>\d+),(?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'^r/(?P<origin>([a-z0-9-_:]+)?)/(?P<destination>([a-z0-9-_:]+)?)/%s$' % pos, map_index, name='site.index'),
|
||||||
|
|
|
@ -1,16 +1,18 @@
|
||||||
# flake8: noqa
|
# flake8: noqa
|
||||||
import json
|
import json
|
||||||
|
from collections import OrderedDict
|
||||||
from datetime import timedelta
|
from datetime import timedelta
|
||||||
from typing import Optional
|
from typing import Mapping, Optional
|
||||||
|
|
||||||
import qrcode
|
import qrcode
|
||||||
from django.core.files import File
|
from django.core.cache import cache
|
||||||
from django.http import Http404, HttpResponse, HttpResponseNotModified, JsonResponse
|
from django.http import Http404, HttpResponse, JsonResponse
|
||||||
from django.shortcuts import get_object_or_404, redirect, render
|
from django.shortcuts import redirect, render
|
||||||
from django.urls import reverse
|
from django.urls import reverse
|
||||||
from django.utils import timezone
|
from django.utils import timezone
|
||||||
|
|
||||||
from c3nav.mapdata.models import Location, LocationSlug, Source
|
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.level import Level
|
||||||
from c3nav.mapdata.models.locations import LocationRedirect, SpecificLocation
|
from c3nav.mapdata.models.locations import LocationRedirect, SpecificLocation
|
||||||
from c3nav.mapdata.render.base import set_tile_access_cookie
|
from c3nav.mapdata.render.base import set_tile_access_cookie
|
||||||
|
@ -83,6 +85,20 @@ def check_location(location: Optional[str], request) -> Optional[SpecificLocatio
|
||||||
return location
|
return location
|
||||||
|
|
||||||
|
|
||||||
|
def get_levels(request) -> Mapping[int, Level]:
|
||||||
|
cache_key = 'mapdata:levels:%s' % AccessPermission.cache_key_for_request(request)
|
||||||
|
levels = cache.get(cache_key, None)
|
||||||
|
if levels is not None:
|
||||||
|
return levels
|
||||||
|
|
||||||
|
levels = OrderedDict(
|
||||||
|
(level.slug, (level.pk, level.slug, level.short_label))
|
||||||
|
for level in Level.qs_for_request(request).order_by('base_altitude')
|
||||||
|
)
|
||||||
|
cache.set(cache_key, levels, 300)
|
||||||
|
return levels
|
||||||
|
|
||||||
|
|
||||||
def map_index(request, origin=None, destination=None, level=None, x=None, y=None, zoom=None):
|
def map_index(request, origin=None, destination=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)
|
||||||
|
|
||||||
|
@ -99,16 +115,27 @@ def map_index(request, origin=None, destination=None, level=None, x=None, y=None
|
||||||
if destination else None),
|
if destination else None),
|
||||||
'sidebar': destination_slug is not None,
|
'sidebar': destination_slug is not None,
|
||||||
}
|
}
|
||||||
|
|
||||||
|
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).order_by('base_altitude')
|
||||||
|
)
|
||||||
|
cache.set(levels_cache_key, levels, 300)
|
||||||
|
|
||||||
|
level = levels.get(level, None) if level else None
|
||||||
if level is not None:
|
if level is not None:
|
||||||
state.update({
|
state.update({
|
||||||
'level': int(level),
|
'level': level[0],
|
||||||
'center': (float(x), float(y)),
|
'center': (float(x), float(y)),
|
||||||
'zoom': float(zoom),
|
'zoom': float(zoom),
|
||||||
})
|
})
|
||||||
|
|
||||||
ctx = {
|
ctx = {
|
||||||
'bounds': json.dumps(Source.max_bounds(), separators=(',', ':')),
|
'bounds': json.dumps(Source.max_bounds(), separators=(',', ':')),
|
||||||
'levels': json.dumps(tuple((level.pk, level.short_label) for level in levels), separators=(',', ':')),
|
'levels': json.dumps(tuple(levels.values()), separators=(',', ':')),
|
||||||
'state': json.dumps(state, separators=(',', ':')),
|
'state': json.dumps(state, separators=(',', ':')),
|
||||||
}
|
}
|
||||||
response = render(request, 'site/map.html', ctx)
|
response = render(request, 'site/map.html', ctx)
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue