reorganize API
This commit is contained in:
parent
a19f3c4de0
commit
7ea4a1bd21
10 changed files with 142 additions and 35 deletions
|
@ -8,16 +8,15 @@ from rest_framework.decorators import detail_route
|
|||
from rest_framework.response import Response
|
||||
from rest_framework.viewsets import ReadOnlyModelViewSet, ViewSet
|
||||
|
||||
from c3nav.mapdata.cache import AccessCachedViewSetMixin, CachedViewSetMixin
|
||||
from c3nav.mapdata.models import FEATURE_TYPES, Feature, Level, Package, Source
|
||||
from c3nav.mapdata.permissions import filter_source_queryset
|
||||
from c3nav.mapdata.serializers import (FeatureSerializer, FeatureTypeSerializer, LevelSerializer, PackageSerializer,
|
||||
SourceSerializer)
|
||||
|
||||
|
||||
class LevelViewSet(CachedViewSetMixin, ReadOnlyModelViewSet):
|
||||
class LevelViewSet(ReadOnlyModelViewSet):
|
||||
"""
|
||||
Returns a list of all levels on the map.
|
||||
List and retrieve levels.
|
||||
"""
|
||||
queryset = Level.objects.all()
|
||||
serializer_class = LevelSerializer
|
||||
|
@ -28,9 +27,9 @@ class LevelViewSet(CachedViewSetMixin, ReadOnlyModelViewSet):
|
|||
search_fields = ('name',)
|
||||
|
||||
|
||||
class PackageViewSet(AccessCachedViewSetMixin, ReadOnlyModelViewSet):
|
||||
class PackageViewSet(ReadOnlyModelViewSet):
|
||||
"""
|
||||
Returns a list of all packages the map consists of.
|
||||
Retrieve packages the map consists of.
|
||||
"""
|
||||
queryset = Package.objects.all()
|
||||
serializer_class = PackageSerializer
|
||||
|
@ -41,10 +40,9 @@ class PackageViewSet(AccessCachedViewSetMixin, ReadOnlyModelViewSet):
|
|||
search_fields = ('name',)
|
||||
|
||||
|
||||
class SourceViewSet(AccessCachedViewSetMixin, ReadOnlyModelViewSet):
|
||||
class SourceViewSet(ReadOnlyModelViewSet):
|
||||
"""
|
||||
Returns a list of source images (to use as a drafts).
|
||||
Call /sources/{name}/image to get the image.
|
||||
List and retrieve source images (to use as a drafts).
|
||||
"""
|
||||
queryset = Source.objects.all()
|
||||
serializer_class = SourceSerializer
|
||||
|
@ -69,9 +67,8 @@ class SourceViewSet(AccessCachedViewSetMixin, ReadOnlyModelViewSet):
|
|||
|
||||
class FeatureTypeViewSet(ViewSet):
|
||||
"""
|
||||
Get Feature types
|
||||
List and retrieve feature types
|
||||
"""
|
||||
|
||||
def list(self, request):
|
||||
serializer = FeatureTypeSerializer(FEATURE_TYPES.values(), many=True, context={'request': request})
|
||||
return Response(serializer.data)
|
||||
|
@ -85,7 +82,7 @@ class FeatureTypeViewSet(ViewSet):
|
|||
|
||||
class FeatureViewSet(ReadOnlyModelViewSet):
|
||||
"""
|
||||
Get all Map Features
|
||||
List and retrieve map features you have access to
|
||||
"""
|
||||
queryset = Feature.objects.all()
|
||||
serializer_class = FeatureSerializer
|
||||
|
|
|
@ -16,6 +16,10 @@ class FeatureType(namedtuple('FeatureType', ('name', 'title', 'title_plural', 'g
|
|||
super().__init__()
|
||||
FEATURE_TYPES[self.name] = self
|
||||
|
||||
@property
|
||||
def pk(self):
|
||||
return self.name
|
||||
|
||||
@property
|
||||
def title_en(self):
|
||||
language = get_language()
|
||||
|
|
|
@ -1,9 +1,13 @@
|
|||
from django.utils.translation import ugettext_lazy as _
|
||||
from rest_framework import serializers
|
||||
from rest_framework.exceptions import ValidationError
|
||||
from rest_framework.reverse import reverse
|
||||
from shapely.geometry import mapping, shape
|
||||
|
||||
from c3nav.api.serializers import RecursiveSerializerMixin
|
||||
from c3nav.editor.hosters import get_hoster_for_package
|
||||
from c3nav.mapdata.models import Feature, Level, Package, Source
|
||||
from c3nav.mapdata.models.feature import FEATURE_TYPES
|
||||
from c3nav.mapdata.utils import sort_geojson
|
||||
|
||||
|
||||
|
@ -27,37 +31,77 @@ class GeometryField(serializers.DictField):
|
|||
raise ValidationError(_('Invalid GeoJSON.'))
|
||||
|
||||
|
||||
class LevelSerializer(serializers.ModelSerializer):
|
||||
class Meta:
|
||||
model = Level
|
||||
fields = ('name', 'altitude', 'package')
|
||||
class PackageSerializer(RecursiveSerializerMixin, serializers.ModelSerializer):
|
||||
hoster = serializers.SerializerMethodField()
|
||||
depends = serializers.SerializerMethodField()
|
||||
|
||||
|
||||
class PackageSerializer(serializers.ModelSerializer):
|
||||
class Meta:
|
||||
model = Package
|
||||
fields = ('name', 'home_repo', 'commit_id', 'depends', 'bounds', 'public')
|
||||
readonly_fields = ('commit_id',)
|
||||
fields = ('name', 'url', 'home_repo', 'commit_id', 'depends', 'bounds', 'public', 'hoster')
|
||||
sparse_exclude = ('depends', 'hoster')
|
||||
extra_kwargs = {
|
||||
'url': {'view_name': 'api:package-detail'}
|
||||
}
|
||||
|
||||
def get_depends(self, obj):
|
||||
return self.recursive_value(PackageSerializer, obj.depends, many=True)
|
||||
|
||||
def get_hoster(self, obj):
|
||||
from c3nav.editor.serializers import HosterSerializer
|
||||
return self.recursive_value(HosterSerializer, get_hoster_for_package(obj))
|
||||
|
||||
|
||||
class SourceSerializer(serializers.ModelSerializer):
|
||||
class LevelSerializer(RecursiveSerializerMixin, serializers.ModelSerializer):
|
||||
package = PackageSerializer(context={'sparse': True})
|
||||
|
||||
class Meta:
|
||||
model = Level
|
||||
fields = ('name', 'url', 'altitude', 'package')
|
||||
sparse_exclude = ('package',)
|
||||
extra_kwargs = {
|
||||
'url': {'view_name': 'api:level-detail'}
|
||||
}
|
||||
|
||||
|
||||
class SourceSerializer(RecursiveSerializerMixin, serializers.ModelSerializer):
|
||||
image_url = serializers.SerializerMethodField()
|
||||
package = PackageSerializer(context={'sparse': True})
|
||||
|
||||
class Meta:
|
||||
model = Source
|
||||
fields = ('name', 'package', 'bounds')
|
||||
fields = ('name', 'url', 'image_url', 'package', 'bounds')
|
||||
sparse_exclude = ('package', )
|
||||
extra_kwargs = {
|
||||
'url': {'view_name': 'api:source-detail'}
|
||||
}
|
||||
|
||||
def get_image_url(self, obj):
|
||||
return reverse('api:source-image', args=(obj.name, ), request=self.context.get('request'))
|
||||
|
||||
|
||||
class FeatureTypeSerializer(serializers.Serializer):
|
||||
name = serializers.CharField()
|
||||
url = serializers.HyperlinkedIdentityField(view_name='api:featuretype-detail')
|
||||
title = serializers.CharField()
|
||||
title_plural = serializers.CharField()
|
||||
geomtype = serializers.CharField()
|
||||
color = serializers.CharField()
|
||||
|
||||
|
||||
class FeatureSerializer(serializers.ModelSerializer):
|
||||
class FeatureSerializer(RecursiveSerializerMixin, serializers.ModelSerializer):
|
||||
titles = serializers.JSONField()
|
||||
feature_type = serializers.SerializerMethodField()
|
||||
level = LevelSerializer()
|
||||
package = PackageSerializer()
|
||||
geometry = GeometryField()
|
||||
|
||||
class Meta:
|
||||
model = Feature
|
||||
fields = ('name', 'title', 'feature_type', 'level', 'titles', 'package', 'geometry')
|
||||
fields = ('name', 'url', 'title', 'feature_type', 'level', 'titles', 'package', 'geometry')
|
||||
sparse_exclude = ('feature_type', 'level', 'package')
|
||||
extra_kwargs = {
|
||||
'url': {'view_name': 'api:feature-detail'}
|
||||
}
|
||||
|
||||
def get_feature_type(self, obj):
|
||||
return self.recursive_value(FeatureTypeSerializer, FEATURE_TYPES.get(obj.feature_type))
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue