def update_waymarks(): # pylint: disable=R0912 places = places_storage.all() roads = roads_storage.all_exists_roads() places_len = len(places) paths = [ [ Path() for place in xrange(places_len) ] for i in xrange(places_len)] # pylint: disable=W0612 p2i = dict( (place.id, i) for i, place in enumerate(places)) for i in xrange(len(places)): paths[i][i].update_path(0, None) for road in roads: i = p2i[road.point_1_id] j = p2i[road.point_2_id] paths[i][j].update_path(road.length, road.id) paths[j][i].update_path(road.length, road.id) for k in xrange(places_len): for i in xrange(places_len): for j in xrange(places_len): new_len = min(paths[i][j].length, paths[i][k].length + paths[k][j].length) paths[i][j].update_path(new_len, paths[i][k].road_id) for row in paths: res = [] for el in row: res.append(el.road_id) for i in xrange(places_len): for j in xrange(places_len): if paths[i][j].road_id is not None: road = roads_storage[paths[i][j].road_id] else: road = None waymark = waymarks_storage.look_for_road(point_from=places[i].id, point_to=places[j].id) if waymark: waymark.road = road waymark.length = paths[i][j].length waymark.save() else: waymark = WaymarkPrototype.create(point_from=places[i], point_to=places[j], road=road, length=paths[i][j].length) waymarks_storage.update_version()
def create(cls, point_from, point_to, road, length): from the_tale.game.map.roads.storage import waymarks_storage try: Waymark.objects.get(point_from=point_from.id, point_to=point_to.id) raise exceptions.WaymarkAlreadyExistsError(start=point_from.id, stop=point_to.id) except Waymark.DoesNotExist: pass model = Waymark.objects.create(point_from=point_from._model, point_to=point_to._model, road=road._model if road else None, length=length) prototype = cls(model) waymarks_storage.add_item(prototype.id, prototype) waymarks_storage.update_version() return prototype