add feature views to api and editor.js
This commit is contained in:
parent
0036b27057
commit
4b74eb0cf5
13 changed files with 216 additions and 178 deletions
0
src/c3nav/mapdata/serializers/__init__.py
Normal file
0
src/c3nav/mapdata/serializers/__init__.py
Normal file
45
src/c3nav/mapdata/serializers/features.py
Normal file
45
src/c3nav/mapdata/serializers/features.py
Normal file
|
@ -0,0 +1,45 @@
|
|||
from rest_framework import serializers
|
||||
|
||||
from c3nav.mapdata.models.features import Inside, Room
|
||||
from c3nav.mapdata.serializers.fields import GeometryField
|
||||
|
||||
|
||||
class FeatureTypeSerializer(serializers.Serializer):
|
||||
name = serializers.SerializerMethodField()
|
||||
title = serializers.SerializerMethodField()
|
||||
title_plural = serializers.SerializerMethodField()
|
||||
endpoint = serializers.SerializerMethodField()
|
||||
geomtype = serializers.CharField()
|
||||
color = serializers.CharField()
|
||||
|
||||
def get_name(self, obj):
|
||||
return obj.__name__.lower()
|
||||
|
||||
def get_title(self, obj):
|
||||
return str(obj._meta.verbose_name)
|
||||
|
||||
def get_title_plural(self, obj):
|
||||
return str(obj._meta.verbose_name_plural)
|
||||
|
||||
def get_endpoint(self, obj):
|
||||
return obj._meta.default_related_name
|
||||
|
||||
|
||||
class InsideSerializer(serializers.ModelSerializer):
|
||||
level = serializers.SlugRelatedField(slug_field='name', read_only=True)
|
||||
package = serializers.SlugRelatedField(slug_field='name', read_only=True)
|
||||
geometry = GeometryField()
|
||||
|
||||
class Meta:
|
||||
model = Inside
|
||||
fields = ('name', 'level', 'package', 'geometry')
|
||||
|
||||
|
||||
class RoomSerializer(serializers.ModelSerializer):
|
||||
level = serializers.SlugRelatedField(slug_field='name', read_only=True)
|
||||
package = serializers.SlugRelatedField(slug_field='name', read_only=True)
|
||||
geometry = GeometryField()
|
||||
|
||||
class Meta:
|
||||
model = Room
|
||||
fields = ('name', 'level', 'package', 'geometry')
|
26
src/c3nav/mapdata/serializers/fields.py
Normal file
26
src/c3nav/mapdata/serializers/fields.py
Normal file
|
@ -0,0 +1,26 @@
|
|||
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
|
||||
|
||||
from c3nav.mapdata.utils import format_geojson
|
||||
|
||||
|
||||
class GeometryField(serializers.DictField):
|
||||
"""
|
||||
shapely geometry objects serialized using GeoJSON
|
||||
"""
|
||||
default_error_messages = {
|
||||
'invalid': _('Invalid GeoJSON.')
|
||||
}
|
||||
|
||||
def to_representation(self, obj):
|
||||
geojson = format_geojson(mapping(obj), round=False)
|
||||
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.'))
|
35
src/c3nav/mapdata/serializers/main.py
Normal file
35
src/c3nav/mapdata/serializers/main.py
Normal file
|
@ -0,0 +1,35 @@
|
|||
from rest_framework import serializers
|
||||
|
||||
from c3nav.editor.hosters import get_hoster_for_package
|
||||
from c3nav.mapdata.models import Level, Package, Source
|
||||
|
||||
|
||||
class PackageSerializer(serializers.ModelSerializer):
|
||||
hoster = serializers.SerializerMethodField()
|
||||
depends = serializers.SlugRelatedField(slug_field='name', many=True, read_only=True)
|
||||
|
||||
class Meta:
|
||||
model = Package
|
||||
fields = ('name', 'home_repo', 'commit_id', 'depends', 'bounds', 'public', 'hoster')
|
||||
|
||||
def get_depends(self, obj):
|
||||
return self.recursive_value(PackageSerializer, obj.depends, many=True)
|
||||
|
||||
def get_hoster(self, obj):
|
||||
return get_hoster_for_package(obj).name
|
||||
|
||||
|
||||
class LevelSerializer(serializers.ModelSerializer):
|
||||
package = serializers.SlugRelatedField(slug_field='name', read_only=True)
|
||||
|
||||
class Meta:
|
||||
model = Level
|
||||
fields = ('name', 'altitude', 'package')
|
||||
|
||||
|
||||
class SourceSerializer(serializers.ModelSerializer):
|
||||
package = serializers.SlugRelatedField(slug_field='name', read_only=True)
|
||||
|
||||
class Meta:
|
||||
model = Source
|
||||
fields = ('name', 'package', 'bounds')
|
Loading…
Add table
Add a link
Reference in a new issue