describe custom locations by space

This commit is contained in:
Laura Klünder 2017-12-10 18:09:31 +01:00
parent 98de7705e0
commit 2d4043861b
2 changed files with 52 additions and 3 deletions

View file

@ -9,6 +9,8 @@ from typing import List, Mapping, Optional
from django.apps import apps from django.apps import apps
from django.core.cache import cache from django.core.cache import cache
from django.db.models import Prefetch, Q from django.db.models import Prefetch, Q
from django.utils.functional import cached_property
from django.utils.text import format_lazy
from django.utils.translation import ugettext_lazy as _ from django.utils.translation import ugettext_lazy as _
from shapely.ops import cascaded_union from shapely.ops import cascaded_union
@ -237,8 +239,6 @@ class CustomLocation:
self.level = level self.level = level
self.x = x self.x = x
self.y = y self.y = y
self.title = _('Coordinates')
self.subtitle = _('%(level)s, x=%(x)s, y=%(y)s') % {'level': self.level.title, 'x': self.x, 'y': self.y}
@property @property
def serialized_geometry(self): def serialized_geometry(self):
@ -253,11 +253,14 @@ class CustomLocation:
('slug', self.pk), ('slug', self.pk),
('title', self.title), ('title', self.title),
('subtitle', self.subtitle), ('subtitle', self.subtitle),
('level', self.level.pk),
('space', self.space.pk),
)) ))
if simple_geometry: if simple_geometry:
result['point'] = (self.level.pk, self.x, self.y) result['point'] = (self.level.pk, self.x, self.y)
result['bounds'] = ((int(math.floor(self.x)), int(math.floor(self.y))), result['bounds'] = ((int(math.floor(self.x)), int(math.floor(self.y))),
(int(math.ceil(self.x)), int(math.ceil(self.y)))) (int(math.ceil(self.x)), int(math.ceil(self.y))))
if geometry: if geometry:
result['geometry'] = self.serialized_geometry result['geometry'] = self.serialized_geometry
return result return result
@ -275,6 +278,12 @@ class CustomLocation:
'title': self.level.title, 'title': self.level.title,
'can_search': self.level.can_search, 'can_search': self.level.can_search,
}), }),
(_('Space'), {
'id': self.space.pk,
'slug': self.space.get_slug(),
'title': self.space.title,
'can_search': self.space.can_search,
} if self.space else None),
(_('X Coordinate'), str(self.x)), (_('X Coordinate'), str(self.x)),
(_('Y Coordinate'), str(self.y)), (_('Y Coordinate'), str(self.y)),
(_('Title'), self.title), (_('Title'), self.title),
@ -282,3 +291,35 @@ class CustomLocation:
], ],
'geometry': self.serialized_geometry, 'geometry': self.serialized_geometry,
} }
@cached_property
def description(self):
from c3nav.routing.router import Router
return Router.load().describe_custom_location(self)
@cached_property
def space(self):
try:
return self.description.space
except Exception:
return None
@cached_property
def title(self):
if self.space:
if self.space.can_describe:
return _('Coordinates in %(space)s') % {'space': self.space.title}
else:
return _('Coordinates on %(level)s') % {'level': self.level.title}
return _('Unreachable coordinates')
@cached_property
def subtitle(self):
if self.space and self.space.can_describe:
return format_lazy(_('{category}, {space}, {level}'),
category=_('Custom location'),
space=self.space.title,
level=self.level.title)
return format_lazy(_('{category}, {level}'),
category=_('Custom location'),
level=self.level.title)

View file

@ -2,7 +2,7 @@ import operator
import os import os
import pickle import pickle
import threading import threading
from collections import deque from collections import deque, namedtuple
from functools import reduce from functools import reduce
from itertools import chain from itertools import chain
@ -252,6 +252,11 @@ class Router:
return self.spaces[space] return self.spaces[space]
return self.spaces[min(level.spaces, key=lambda space: self.spaces[space].geometry.distance(point))] return self.spaces[min(level.spaces, key=lambda space: self.spaces[space].geometry.distance(point))]
def describe_custom_location(self, location):
return CustomLocationDescription(
space=self.space_for_point(location.level.pk, location)
)
@cached_property @cached_property
def shortest_path(self): def shortest_path(self):
return shortest_path(self.graph, directed=True, return_predecessors=True) return shortest_path(self.graph, directed=True, return_predecessors=True)
@ -295,6 +300,9 @@ class Router:
origin_addition, destination_addition) origin_addition, destination_addition)
CustomLocationDescription = namedtuple('CustomLocationDescription', ('space'))
class BaseRouterProxy: class BaseRouterProxy:
def __init__(self, src): def __init__(self, src):
self.src = src self.src = src