add GeometryField and features api endpoint
This commit is contained in:
parent
de35a20854
commit
e6cbe5bf27
8 changed files with 100 additions and 5 deletions
24
src/c3nav/api/fields.py
Normal file
24
src/c3nav/api/fields.py
Normal file
|
@ -0,0 +1,24 @@
|
|||
from django.utils.translation import ugettext_lazy as _
|
||||
from rest_framework import serializers
|
||||
from rest_framework.exceptions import ValidationError
|
||||
from shapely.geometry import mapping, shape
|
||||
|
||||
|
||||
class GeometryField(serializers.DictField):
|
||||
"""
|
||||
shapely geometry objects serialized using GeoJSON
|
||||
"""
|
||||
default_error_messages = {
|
||||
'invalid': _('Invalid GeoJSON.')
|
||||
}
|
||||
|
||||
def to_representation(self, obj):
|
||||
geojson = mapping(obj)
|
||||
return super().to_representation(geojson)
|
||||
|
||||
def to_internal_value(self, data):
|
||||
geojson = super().to_internal_value(data)
|
||||
try:
|
||||
return shape(geojson)
|
||||
except:
|
||||
raise ValidationError(_('Invalid GeoJSON.'))
|
|
@ -2,7 +2,8 @@ from django.conf import settings
|
|||
from rest_framework import serializers
|
||||
|
||||
from ..editor.hosters import get_hoster_for_package
|
||||
from ..mapdata.models import Level, Package, Source
|
||||
from ..mapdata.models import Feature, Level, Package, Source
|
||||
from .fields import GeometryField
|
||||
from .permissions import can_access_package
|
||||
|
||||
|
||||
|
@ -42,6 +43,14 @@ class FeatureTypeSerializer(serializers.Serializer):
|
|||
color = serializers.CharField()
|
||||
|
||||
|
||||
class FeatureSerializer(serializers.ModelSerializer):
|
||||
geometry = GeometryField()
|
||||
|
||||
class Meta:
|
||||
model = Feature
|
||||
fields = ('name', 'package', 'feature_type', 'geometry')
|
||||
|
||||
|
||||
class HosterSerializer(serializers.Serializer):
|
||||
name = serializers.CharField()
|
||||
base_url = serializers.CharField()
|
||||
|
|
|
@ -9,6 +9,7 @@ router.register(r'levels', mapdata_views.LevelViewSet)
|
|||
router.register(r'packages', mapdata_views.PackageViewSet)
|
||||
router.register(r'sources', mapdata_views.SourceViewSet)
|
||||
router.register(r'featuretypes', mapdata_views.FeatureTypeViewSet, base_name='featuretype')
|
||||
router.register(r'features', editor_views.FeatureViewSet)
|
||||
router.register(r'hosters', editor_views.HosterViewSet, base_name='hoster')
|
||||
|
||||
|
||||
|
|
|
@ -1,9 +1,10 @@
|
|||
from django.http import Http404
|
||||
from rest_framework.response import Response
|
||||
from rest_framework.viewsets import ViewSet
|
||||
from rest_framework.viewsets import ModelViewSet, ViewSet
|
||||
|
||||
from ...editor.hosters import hosters
|
||||
from ..serializers import HosterSerializer
|
||||
from ...mapdata.models import Feature
|
||||
from ..serializers import FeatureSerializer, HosterSerializer
|
||||
|
||||
|
||||
class HosterViewSet(ViewSet):
|
||||
|
@ -19,3 +20,12 @@ class HosterViewSet(ViewSet):
|
|||
raise Http404
|
||||
serializer = HosterSerializer(hosters[pk], context={'request': request})
|
||||
return Response(serializer.data)
|
||||
|
||||
|
||||
class FeatureViewSet(ModelViewSet):
|
||||
"""
|
||||
Get all Map Features including ones that are only part of the current session
|
||||
"""
|
||||
queryset = Feature.objects.all()
|
||||
serializer_class = FeatureSerializer
|
||||
lookup_value_regex = '[^/]+'
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue