add routing api

This commit is contained in:
Laura Klünder 2017-11-27 16:40:15 +01:00
parent c6948b4ce0
commit 4c88cb2504
3 changed files with 60 additions and 0 deletions

View file

@ -12,6 +12,7 @@ from c3nav.mapdata.api import (AccessRestrictionViewSet, AreaViewSet, BuildingVi
HoleViewSet, LevelViewSet, LineObstacleViewSet, LocationBySlugViewSet,
LocationGroupCategoryViewSet, LocationGroupViewSet, LocationViewSet, MapViewSet,
ObstacleViewSet, POIViewSet, RampViewSet, SourceViewSet, SpaceViewSet, StairViewSet)
from c3nav.routing.api import RoutingViewSet
router = SimpleRouter()
router.register(r'map', MapViewSet, base_name='map')
@ -35,6 +36,8 @@ router.register(r'locations/by_slug', LocationBySlugViewSet, base_name='location
router.register(r'locationgroupcategories', LocationGroupCategoryViewSet)
router.register(r'locationgroups', LocationGroupViewSet)
router.register(r'routing', RoutingViewSet, base_name='routing')
router.register(r'editor', EditorViewSet, base_name='editor')
router.register(r'changesets', ChangeSetViewSet)

32
src/c3nav/routing/api.py Normal file
View file

@ -0,0 +1,32 @@
from rest_framework.decorators import list_route
from rest_framework.response import Response
from rest_framework.viewsets import ViewSet
from c3nav.routing.forms import RouteForm
from c3nav.routing.router import Router
class RoutingViewSet(ViewSet):
"""
Routing API
/geometries/ returns a list of geojson features, you have to specify ?level=<id> or ?space=<id>
/geometrystyles/ returns styling information for all geometry types
/bounds/ returns the maximum bounds of the map
"""
def list(self, request):
return []
@list_route(methods=['get'])
def route(self, request, *args, **kwargs):
params = request.POST if request.method == 'POST' else request.GET
form = RouteForm(params, request=request)
if not form.is_valid():
return Response({
'errors': form.errors,
})
route = Router.load().get_route(form.cleaned_data['origin'], form.cleaned_data['destination'])
return Response(route.serialize())

View file

@ -0,0 +1,25 @@
from django import forms
from django.utils.translation import ugettext_lazy
from c3nav.mapdata.utils.locations import locations_for_request
class RouteForm(forms.Form):
origin = forms.IntegerField(min_value=1)
destination = forms.IntegerField(min_value=1)
def __init__(self, *args, request=None, **kwargs):
self.request = request
super().__init__(*args, **kwargs)
def clean_origin(self):
try:
return locations_for_request(self.request)[self.cleaned_data['origin']]
except KeyError:
raise forms.ValidationError(ugettext_lazy('Unknown origin.'))
def clean_destination(self):
try:
return locations_for_request(self.request)[self.cleaned_data['destination']]
except KeyError:
raise forms.ValidationError(ugettext_lazy('Unknown destination.'))