new altitude modeling

This commit is contained in:
Laura Klünder 2017-08-05 11:56:29 +02:00
parent a6e00fa015
commit 6930e1bb7c
8 changed files with 102 additions and 9 deletions

View file

@ -173,6 +173,7 @@ class EditorViewSet(ViewSet):
space.obstacles.all(), space.obstacles.all(),
space.lineobstacles.all(), space.lineobstacles.all(),
space.columns.all(), space.columns.all(),
space.altitudemarkers.all(),
space.pois.filter(POI.q_for_request(request)).prefetch_related('groups'), space.pois.filter(POI.q_for_request(request)).prefetch_related('groups'),
other_spaces_upper, other_spaces_upper,
graphedges, graphedges,
@ -204,6 +205,7 @@ class EditorViewSet(ViewSet):
'graphnode': '#00BB00', 'graphnode': '#00BB00',
'graphnode__space_transfer': '#008800', 'graphnode__space_transfer': '#008800',
'graphedge': '#00CC00', 'graphedge': '#00CC00',
'altitudemarker': '#ffff00',
}) })
@list_route(methods=['get']) @list_route(methods=['get'])

View file

@ -160,9 +160,9 @@ class EditorFormBase(ModelForm):
def create_editor_form(editor_model): def create_editor_form(editor_model):
possible_fields = ['slug', 'name', 'altitude', 'category', 'width', 'groups', 'color', 'priority', 'waytype', possible_fields = ['slug', 'name', 'ordering', 'category', 'width', 'groups', 'color', 'priority', 'altitude',
'access_restriction', 'space_transfer', 'can_search', 'can_describe', 'outside', 'geometry', 'waytype', 'access_restriction', 'space_transfer', 'can_search', 'can_describe', 'outside',
'single', 'allow_levels', 'allow_spaces', 'allow_areas', 'allow_pois', 'geometry', 'single', 'allow_levels', 'allow_spaces', 'allow_areas', 'allow_pois',
'left', 'top', 'right', 'bottom'] 'left', 'top', 'right', 'bottom']
field_names = [field.name for field in editor_model._meta.get_fields() if not field.one_to_many] field_names = [field.name for field in editor_model._meta.get_fields() if not field.one_to_many]
existing_fields = [name for name in possible_fields if name in field_names] existing_fields = [name for name in possible_fields if name in field_names]

View file

@ -63,3 +63,4 @@ urlpatterns.extend(add_editor_urls('Obstacle', 'Space'))
urlpatterns.extend(add_editor_urls('LineObstacle', 'Space')) urlpatterns.extend(add_editor_urls('LineObstacle', 'Space'))
urlpatterns.extend(add_editor_urls('Column', 'Space')) urlpatterns.extend(add_editor_urls('Column', 'Space'))
urlpatterns.extend(add_editor_urls('POI', 'Space')) urlpatterns.extend(add_editor_urls('POI', 'Space'))
urlpatterns.extend(add_editor_urls('AltitudeMarker', 'Space'))

View file

@ -78,7 +78,8 @@ def space_detail(request, level, pk):
'can_edit': request.changeset.can_edit(request), 'can_edit': request.changeset.can_edit(request),
'child_models': [child_model(request, model_name, kwargs={'space': pk}, parent=space) 'child_models': [child_model(request, model_name, kwargs={'space': pk}, parent=space)
for model_name in ('Hole', 'Area', 'Stair', 'Obstacle', 'LineObstacle', 'Column', 'POI')], for model_name in ('Hole', 'Area', 'Stair', 'Obstacle', 'LineObstacle', 'Column', 'POI',
'AltitudeMarker')],
'geometry_url': '/api/editor/geometries/?space='+pk, 'geometry_url': '/api/editor/geometries/?space='+pk,
}) })

View file

@ -0,0 +1,63 @@
# -*- coding: utf-8 -*-
# Generated by Django 1.11.2 on 2017-08-05 09:48
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', '0029_auto_20170714_1519'),
]
operations = [
migrations.CreateModel(
name='AltitudeArea',
fields=[
('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
('geometry', c3nav.mapdata.fields.GeometryField(default=None, geomtype='polygon')),
('altitude', models.DecimalField(decimal_places=2, max_digits=6, verbose_name='altitude')),
],
options={
'verbose_name': 'Altitude Area',
'verbose_name_plural': 'Altitude Areas',
'default_related_name': 'altitudeareas',
},
),
migrations.CreateModel(
name='AltitudeMarker',
fields=[
('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
('geometry', c3nav.mapdata.fields.GeometryField(default=None, geomtype='point')),
('altitude', models.DecimalField(decimal_places=2, max_digits=6, verbose_name='altitude')),
('space', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='altitudemarkers', to='mapdata.Space', verbose_name='space')),
],
options={
'verbose_name': 'Altitude Marker',
'verbose_name_plural': 'Altitude Markers',
'default_related_name': 'altitudemarkers',
},
),
migrations.AlterModelOptions(
name='level',
options={'ordering': ['ordering'], 'verbose_name': 'Level', 'verbose_name_plural': 'Levels'},
),
migrations.RenameField(
model_name='level',
old_name='altitude',
new_name='ordering',
),
migrations.AlterField(
model_name='level',
name='ordering',
field=models.DecimalField(decimal_places=2, max_digits=6, unique=True, verbose_name='ordering'),
),
migrations.AddField(
model_name='altitudearea',
name='level',
field=models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='altitudeareas', to='mapdata.Level', verbose_name='level'),
),
]

View file

@ -66,3 +66,16 @@ class Door(AccessRestrictionMixin, LevelGeometryMixin, models.Model):
verbose_name = _('Door') verbose_name = _('Door')
verbose_name_plural = _('Doors') verbose_name_plural = _('Doors')
default_related_name = 'doors' default_related_name = 'doors'
class AltitudeArea(LevelGeometryMixin, models.Model):
"""
An altitude area
"""
geometry = GeometryField('polygon')
altitude = models.DecimalField(_('altitude'), null=False, max_digits=6, decimal_places=2)
class Meta:
verbose_name = _('Altitude Area')
verbose_name_plural = _('Altitude Areas')
default_related_name = 'altitudeareas'

View file

@ -162,3 +162,16 @@ class Hole(SpaceGeometryMixin, models.Model):
verbose_name = _('Hole') verbose_name = _('Hole')
verbose_name_plural = _('Holes') verbose_name_plural = _('Holes')
default_related_name = 'holes' default_related_name = 'holes'
class AltitudeMarker(SpaceGeometryMixin, models.Model):
"""
An altitude marker
"""
geometry = GeometryField('point')
altitude = models.DecimalField(_('altitude'), null=False, max_digits=6, decimal_places=2)
class Meta:
verbose_name = _('Altitude Marker')
verbose_name_plural = _('Altitude Markers')
default_related_name = 'altitudemarkers'

View file

@ -16,7 +16,7 @@ class Level(SpecificLocation, models.Model):
""" """
A map level A map level
""" """
altitude = models.DecimalField(_('level altitude'), null=False, unique=True, max_digits=6, decimal_places=2) ordering = models.DecimalField(_('ordering'), null=False, unique=True, max_digits=6, decimal_places=2)
on_top_of = models.ForeignKey('mapdata.Level', null=True, on_delete=models.CASCADE, on_top_of = models.ForeignKey('mapdata.Level', null=True, on_delete=models.CASCADE,
related_name='levels_on_top', verbose_name=_('on top of')) related_name='levels_on_top', verbose_name=_('on top of'))
@ -24,7 +24,7 @@ class Level(SpecificLocation, models.Model):
verbose_name = _('Level') verbose_name = _('Level')
verbose_name_plural = _('Levels') verbose_name_plural = _('Levels')
default_related_name = 'levels' default_related_name = 'levels'
ordering = ['altitude'] ordering = ['ordering']
def __init__(self, *args, **kwargs): def __init__(self, *args, **kwargs):
super().__init__(*args, **kwargs) super().__init__(*args, **kwargs)
@ -34,14 +34,14 @@ class Level(SpecificLocation, models.Model):
raise TypeError raise TypeError
if level_model is None: if level_model is None:
level_model = Level level_model = Level
return level_model.objects.filter(altitude__lt=self.altitude, on_top_of__isnull=True).order_by('-altitude') return level_model.objects.filter(ordering__lt=self.ordering, on_top_of__isnull=True).order_by('-ordering')
def higher(self, level_model=None): def higher(self, level_model=None):
if self.on_top_of_id is not None: if self.on_top_of_id is not None:
raise TypeError raise TypeError
if level_model is None: if level_model is None:
level_model = Level level_model = Level
return level_model.objects.filter(altitude__gt=self.altitude, on_top_of__isnull=True).order_by('altitude') return level_model.objects.filter(ordering__gt=self.ordering, on_top_of__isnull=True).order_by('ordering')
@property @property
def sublevels(self): def sublevels(self):
@ -63,7 +63,7 @@ class Level(SpecificLocation, models.Model):
def _serialize(self, level=True, **kwargs): def _serialize(self, level=True, **kwargs):
result = super()._serialize(**kwargs) result = super()._serialize(**kwargs)
result['altitude'] = float(str(self.altitude)) result['ordering'] = float(str(self.ordering))
return result return result
def _render_space_ground(self, svg, space): def _render_space_ground(self, svg, space):