From 1ab447bbf024f71e02d2ceb8b6eb331a05653f09 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Laura=20Kl=C3=BCnder?= Date: Thu, 29 Dec 2016 20:06:57 +0100 Subject: [PATCH] option to output route as JSON --- src/c3nav/routing/route.py | 25 +++++++++++++++++++++++++ src/c3nav/site/views.py | 7 +++++++ 2 files changed, 32 insertions(+) diff --git a/src/c3nav/routing/route.py b/src/c3nav/routing/route.py index 705be2e4..ed3d36a5 100644 --- a/src/c3nav/routing/route.py +++ b/src/c3nav/routing/route.py @@ -1,3 +1,5 @@ +from collections import OrderedDict + import copy import numpy as np @@ -18,6 +20,12 @@ class Route: self.routeparts = None + def serialize(self): + return OrderedDict(( + ('distance', float(self.distance)), + ('routeparts', [routepart.serialize() for routepart in self.routeparts]), + )) + def __repr__(self): return ('' % ('\n '.join(repr(connection) for connection in self.connections), self.distance)) @@ -227,6 +235,12 @@ class RoutePart: self.level = graphlevel.level self.lines = lines + def serialize(self): + return OrderedDict(( + ('level', self.level.name), + ('lines', [line.serialize() for line in self.lines]), + )) + def render_svg_coordinates(self): svg_width, svg_height = get_dimensions() @@ -283,6 +297,17 @@ class RouteLine: self.title = None self.description = None + def serialize(self): + return OrderedDict(( + ('from_point', tuple(self.from_point.xy)), + ('to_point', tuple(self.to_point.xy)), + ('distance', float(self.distance)), + ('icon', self.icon), + ('ignore', self.ignore), + ('title', self.title), + ('description', self.description), + )) + class NoRoute: distance = np.inf diff --git a/src/c3nav/site/views.py b/src/c3nav/site/views.py index 565a8546..dba0809a 100644 --- a/src/c3nav/site/views.py +++ b/src/c3nav/site/views.py @@ -3,6 +3,7 @@ from datetime import timedelta import qrcode from django.core.files import File from django.http import Http404, HttpResponse, HttpResponseNotModified +from django.http import JsonResponse from django.shortcuts import get_object_or_404, redirect, render from django.urls import reverse from django.utils import timezone @@ -216,6 +217,12 @@ def main(request, location=None, origin=None, destination=None): route.describe(allowed_ctypes) ctx.update({'route': route}) + if request.GET.get('format') == 'json': + if 'error' in ctx: + return JsonResponse({'error': ctx['error']}) + if 'route' in ctx: + return JsonResponse({'route': ctx['route'].serialize()}) + response = render(request, 'site/main.html', ctx) if request.method == 'POST' and save_settings: