diff --git a/src/c3nav/api/urls.py b/src/c3nav/api/urls.py index bf88240e..55b877f6 100644 --- a/src/c3nav/api/urls.py +++ b/src/c3nav/api/urls.py @@ -11,7 +11,7 @@ from c3nav.editor.api import ChangeSetViewSet, EditorViewSet from c3nav.mapdata.api import (AccessRestrictionViewSet, AreaViewSet, BuildingViewSet, ColumnViewSet, DoorViewSet, HoleViewSet, LevelViewSet, LineObstacleViewSet, LocationGroupCategoryViewSet, LocationGroupViewSet, LocationViewSet, MapViewSet, ObstacleViewSet, POIViewSet, - SourceViewSet, SpaceViewSet, StairViewSet) + RampViewSet, SourceViewSet, SpaceViewSet, StairViewSet) router = SimpleRouter() router.register(r'map', MapViewSet, base_name='map') @@ -22,6 +22,7 @@ router.register(r'doors', DoorViewSet) router.register(r'holes', HoleViewSet) router.register(r'areas', AreaViewSet) router.register(r'stairs', StairViewSet) +router.register(r'ramps', RampViewSet) router.register(r'obstacles', ObstacleViewSet) router.register(r'lineobstacles', LineObstacleViewSet) router.register(r'columns', ColumnViewSet) diff --git a/src/c3nav/editor/api.py b/src/c3nav/editor/api.py index b5af6828..379bcd8e 100644 --- a/src/c3nav/editor/api.py +++ b/src/c3nav/editor/api.py @@ -178,6 +178,7 @@ class EditorViewSet(ViewSet): space.areas.filter(Area.q_for_request(request)).prefetch_related('groups'), space.holes.all(), space.stairs.all(), + space.ramps.all(), space.obstacles.all(), space.lineobstacles.all(), space.columns.all(), @@ -201,6 +202,7 @@ class EditorViewSet(ViewSet): 'door': '#ffffff', 'area': 'rgba(85, 170, 255, 0.2)', 'stair': '#a000a0', + 'ramp': 'rgba(160, 0, 160, 0.2)', 'obstacle': '#999999', 'lineobstacle': '#999999', 'column': '#888888', diff --git a/src/c3nav/editor/urls.py b/src/c3nav/editor/urls.py index 4700825c..d84aa6d8 100644 --- a/src/c3nav/editor/urls.py +++ b/src/c3nav/editor/urls.py @@ -59,6 +59,7 @@ urlpatterns.extend(add_editor_urls('Door', 'Level')) urlpatterns.extend(add_editor_urls('Hole', 'Space')) urlpatterns.extend(add_editor_urls('Area', 'Space')) urlpatterns.extend(add_editor_urls('Stair', 'Space')) +urlpatterns.extend(add_editor_urls('Ramp', 'Space')) urlpatterns.extend(add_editor_urls('Obstacle', 'Space')) urlpatterns.extend(add_editor_urls('LineObstacle', 'Space')) urlpatterns.extend(add_editor_urls('Column', 'Space')) diff --git a/src/c3nav/editor/views/edit.py b/src/c3nav/editor/views/edit.py index 385a7585..46e4b288 100644 --- a/src/c3nav/editor/views/edit.py +++ b/src/c3nav/editor/views/edit.py @@ -81,8 +81,8 @@ def space_detail(request, level, pk): 'can_edit': request.changeset.can_edit(request), 'child_models': [child_model(request, model_name, kwargs={'space': pk}, parent=space) - for model_name in ('Hole', 'Area', 'Stair', 'Obstacle', 'LineObstacle', 'Column', 'POI', - 'AltitudeMarker')], + for model_name in ('Hole', 'Area', 'Stair', 'Ramp', 'Obstacle', 'LineObstacle', 'Column', + 'POI', 'AltitudeMarker')], 'geometry_url': '/api/editor/geometries/?space='+pk, }) diff --git a/src/c3nav/mapdata/api.py b/src/c3nav/mapdata/api.py index deb9d26e..8f9bc55c 100644 --- a/src/c3nav/mapdata/api.py +++ b/src/c3nav/mapdata/api.py @@ -19,7 +19,8 @@ from rest_framework.viewsets import GenericViewSet, ReadOnlyModelViewSet, ViewSe from c3nav.mapdata.models import AccessRestriction, Building, Door, Hole, LocationGroup, MapUpdate, Source, Space from c3nav.mapdata.models.access import AccessPermission from c3nav.mapdata.models.geometry.level import LevelGeometryMixin -from c3nav.mapdata.models.geometry.space import POI, Area, Column, LineObstacle, Obstacle, SpaceGeometryMixin, Stair +from c3nav.mapdata.models.geometry.space import (POI, Area, Column, LineObstacle, Obstacle, Ramp, SpaceGeometryMixin, + Stair) from c3nav.mapdata.models.level import Level from c3nav.mapdata.models.locations import (Location, LocationGroupCategory, LocationRedirect, LocationSlug, SpecificLocation) @@ -208,6 +209,11 @@ class StairViewSet(MapdataViewSet): queryset = Stair.objects.all() +class RampViewSet(MapdataViewSet): + """ Add ?geometry=1 to get geometries, add ?space= to filter by space. """ + queryset = Ramp.objects.all() + + class ObstacleViewSet(MapdataViewSet): """ Add ?geometry=1 to get geometries, add ?space= to filter by space. """ queryset = Obstacle.objects.all() diff --git a/src/c3nav/mapdata/migrations/0048_ramp.py b/src/c3nav/mapdata/migrations/0048_ramp.py new file mode 100644 index 00000000..f49af5b4 --- /dev/null +++ b/src/c3nav/mapdata/migrations/0048_ramp.py @@ -0,0 +1,34 @@ +# -*- coding: utf-8 -*- +# Generated by Django 1.11.6 on 2017-11-17 19:24 +from __future__ import unicode_literals + +import c3nav.mapdata.fields +from django.db import migrations, models +import django.db.models.deletion + + +class Migration(migrations.Migration): + + dependencies = [ + ('mapdata', '0047_remove_mapupdate_changed_geometries'), + ] + + operations = [ + migrations.CreateModel( + name='Ramp', + fields=[ + ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), + ('minx', models.DecimalField(db_index=True, decimal_places=2, max_digits=6, verbose_name='min x coordinate')), + ('miny', models.DecimalField(db_index=True, decimal_places=2, max_digits=6, verbose_name='min y coordinate')), + ('maxx', models.DecimalField(db_index=True, decimal_places=2, max_digits=6, verbose_name='max x coordinate')), + ('maxy', models.DecimalField(db_index=True, decimal_places=2, max_digits=6, verbose_name='max y coordinate')), + ('geometry', c3nav.mapdata.fields.GeometryField(default=None, geomtype='polygon')), + ('space', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='ramps', to='mapdata.Space', verbose_name='space')), + ], + options={ + 'verbose_name': 'Ramp', + 'verbose_name_plural': 'Ramps', + 'default_related_name': 'ramps', + }, + ), + ] diff --git a/src/c3nav/mapdata/models/geometry/space.py b/src/c3nav/mapdata/models/geometry/space.py index bfb54cb3..49751095 100644 --- a/src/c3nav/mapdata/models/geometry/space.py +++ b/src/c3nav/mapdata/models/geometry/space.py @@ -112,6 +112,18 @@ class Stair(SpaceGeometryMixin, models.Model): default_related_name = 'stairs' +class Ramp(SpaceGeometryMixin, models.Model): + """ + A ramp + """ + geometry = GeometryField('polygon') + + class Meta: + verbose_name = _('Ramp') + verbose_name_plural = _('Ramps') + default_related_name = 'ramps' + + class Obstacle(SpaceGeometryMixin, models.Model): """ An obstacle