2017-05-29 10:18:59 +02:00
|
|
|
# flake8: noqa
|
2016-12-19 15:11:11 +01:00
|
|
|
import copy
|
2017-11-27 15:01:58 +01:00
|
|
|
from collections import OrderedDict, deque
|
2016-12-19 15:11:11 +01:00
|
|
|
|
2016-12-17 13:24:42 +01:00
|
|
|
import numpy as np
|
2017-11-27 15:41:25 +01:00
|
|
|
from django.utils.functional import cached_property
|
2016-12-19 15:11:11 +01:00
|
|
|
from django.utils.translation import ugettext_lazy as _
|
2016-12-17 13:24:42 +01:00
|
|
|
|
2016-12-17 14:46:15 +01:00
|
|
|
|
2016-12-17 19:25:27 +01:00
|
|
|
class Route:
|
2017-11-27 15:01:58 +01:00
|
|
|
def __init__(self, router, origin, destination, distance, path_nodes):
|
|
|
|
self.router = router
|
|
|
|
self.origin = origin
|
|
|
|
self.destination = destination
|
|
|
|
self.distance = distance
|
|
|
|
self.path_nodes = path_nodes
|
2016-12-19 15:11:11 +01:00
|
|
|
|
2016-12-29 20:06:57 +01:00
|
|
|
def serialize(self):
|
2017-11-27 15:01:58 +01:00
|
|
|
items = deque()
|
|
|
|
last_node = None
|
|
|
|
last_item = None
|
2017-11-27 16:49:12 +01:00
|
|
|
distance = 0
|
2017-11-27 15:01:58 +01:00
|
|
|
for i, node in enumerate(self.path_nodes):
|
2017-11-27 16:49:12 +01:00
|
|
|
edge = self.router.edges[last_node, node] if last_node else None
|
|
|
|
item = RouteItem(self, self.router.nodes[node], edge, last_item)
|
|
|
|
if edge:
|
|
|
|
distance += edge.distance
|
2017-11-27 15:01:58 +01:00
|
|
|
items.append(item)
|
|
|
|
last_item = item
|
|
|
|
last_node = node
|
2016-12-29 20:06:57 +01:00
|
|
|
return OrderedDict((
|
2017-11-27 16:47:47 +01:00
|
|
|
('origin', self.origin.serialize(detailed=False)),
|
|
|
|
('destination', self.destination.serialize(detailed=False)),
|
2017-11-27 16:49:12 +01:00
|
|
|
('distance', round(distance, 2)),
|
2017-11-27 15:01:58 +01:00
|
|
|
('items', tuple(item.serialize() for item in items)),
|
2016-12-29 20:06:57 +01:00
|
|
|
))
|
|
|
|
|
2016-12-19 15:11:11 +01:00
|
|
|
|
2017-11-27 15:01:58 +01:00
|
|
|
class RouteItem:
|
|
|
|
def __init__(self, route, node, edge, last_item):
|
|
|
|
self.route = route
|
|
|
|
self.node = node
|
|
|
|
self.edge = edge
|
|
|
|
self.last_item = last_item
|
2016-12-17 14:46:15 +01:00
|
|
|
|
2017-11-27 15:41:25 +01:00
|
|
|
@cached_property
|
|
|
|
def waytype(self):
|
|
|
|
if self.edge and self.edge.waytype:
|
|
|
|
return self.route.router.waytypes[self.edge.waytype]
|
|
|
|
|
|
|
|
@cached_property
|
|
|
|
def space(self):
|
|
|
|
return self.route.router.spaces[self.node.space]
|
|
|
|
|
|
|
|
@cached_property
|
|
|
|
def level(self):
|
|
|
|
return self.route.router.levels[self.space.level_id]
|
|
|
|
|
2016-12-29 20:06:57 +01:00
|
|
|
def serialize(self):
|
2017-11-27 15:41:25 +01:00
|
|
|
result = OrderedDict((
|
2017-11-27 15:01:58 +01:00
|
|
|
('id', self.node.pk),
|
2017-11-27 16:42:35 +01:00
|
|
|
('coordinates', (self.node.x, self.node.y, self.node.altitude)),
|
2017-11-27 15:01:58 +01:00
|
|
|
('waytype', (self.route.router.waytypes[self.edge.waytype].serialize(detailed=False)
|
|
|
|
if self.edge and self.edge.waytype else None)),
|
2016-12-29 20:06:57 +01:00
|
|
|
))
|
2017-11-27 15:41:25 +01:00
|
|
|
if self.waytype:
|
|
|
|
result['waytype'] = self.waytype.serialize(detailed=False)
|
|
|
|
|
|
|
|
if not self.last_item or self.space.pk != self.last_item.space.pk:
|
2017-11-27 23:38:55 +01:00
|
|
|
result['space'] = self.space.serialize(detailed=False, describe_only=True)
|
2017-11-27 15:41:25 +01:00
|
|
|
|
|
|
|
if not self.last_item or self.level.pk != self.last_item.level.pk:
|
2017-11-27 23:38:55 +01:00
|
|
|
result['level'] = self.level.serialize(detailed=False, describe_only=True)
|
2017-11-27 15:41:25 +01:00
|
|
|
return result
|
|
|
|
|
2016-12-29 20:06:57 +01:00
|
|
|
|
2016-12-17 13:24:42 +01:00
|
|
|
|
|
|
|
class NoRoute:
|
|
|
|
distance = np.inf
|