new altitude modeling
This commit is contained in:
parent
a6e00fa015
commit
6930e1bb7c
8 changed files with 102 additions and 9 deletions
|
@ -173,6 +173,7 @@ class EditorViewSet(ViewSet):
|
|||
space.obstacles.all(),
|
||||
space.lineobstacles.all(),
|
||||
space.columns.all(),
|
||||
space.altitudemarkers.all(),
|
||||
space.pois.filter(POI.q_for_request(request)).prefetch_related('groups'),
|
||||
other_spaces_upper,
|
||||
graphedges,
|
||||
|
@ -204,6 +205,7 @@ class EditorViewSet(ViewSet):
|
|||
'graphnode': '#00BB00',
|
||||
'graphnode__space_transfer': '#008800',
|
||||
'graphedge': '#00CC00',
|
||||
'altitudemarker': '#ffff00',
|
||||
})
|
||||
|
||||
@list_route(methods=['get'])
|
||||
|
|
|
@ -160,9 +160,9 @@ class EditorFormBase(ModelForm):
|
|||
|
||||
|
||||
def create_editor_form(editor_model):
|
||||
possible_fields = ['slug', 'name', 'altitude', 'category', 'width', 'groups', 'color', 'priority', 'waytype',
|
||||
'access_restriction', 'space_transfer', 'can_search', 'can_describe', 'outside', 'geometry',
|
||||
'single', 'allow_levels', 'allow_spaces', 'allow_areas', 'allow_pois',
|
||||
possible_fields = ['slug', 'name', 'ordering', 'category', 'width', 'groups', 'color', 'priority', 'altitude',
|
||||
'waytype', 'access_restriction', 'space_transfer', 'can_search', 'can_describe', 'outside',
|
||||
'geometry', 'single', 'allow_levels', 'allow_spaces', 'allow_areas', 'allow_pois',
|
||||
'left', 'top', 'right', 'bottom']
|
||||
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]
|
||||
|
|
|
@ -63,3 +63,4 @@ urlpatterns.extend(add_editor_urls('Obstacle', 'Space'))
|
|||
urlpatterns.extend(add_editor_urls('LineObstacle', 'Space'))
|
||||
urlpatterns.extend(add_editor_urls('Column', 'Space'))
|
||||
urlpatterns.extend(add_editor_urls('POI', 'Space'))
|
||||
urlpatterns.extend(add_editor_urls('AltitudeMarker', 'Space'))
|
||||
|
|
|
@ -78,7 +78,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')],
|
||||
for model_name in ('Hole', 'Area', 'Stair', 'Obstacle', 'LineObstacle', 'Column', 'POI',
|
||||
'AltitudeMarker')],
|
||||
'geometry_url': '/api/editor/geometries/?space='+pk,
|
||||
})
|
||||
|
||||
|
|
63
src/c3nav/mapdata/migrations/0030_altitudes.py
Normal file
63
src/c3nav/mapdata/migrations/0030_altitudes.py
Normal 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'),
|
||||
),
|
||||
]
|
|
@ -66,3 +66,16 @@ class Door(AccessRestrictionMixin, LevelGeometryMixin, models.Model):
|
|||
verbose_name = _('Door')
|
||||
verbose_name_plural = _('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'
|
||||
|
|
|
@ -162,3 +162,16 @@ class Hole(SpaceGeometryMixin, models.Model):
|
|||
verbose_name = _('Hole')
|
||||
verbose_name_plural = _('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'
|
||||
|
|
|
@ -16,7 +16,7 @@ class Level(SpecificLocation, models.Model):
|
|||
"""
|
||||
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,
|
||||
related_name='levels_on_top', verbose_name=_('on top of'))
|
||||
|
||||
|
@ -24,7 +24,7 @@ class Level(SpecificLocation, models.Model):
|
|||
verbose_name = _('Level')
|
||||
verbose_name_plural = _('Levels')
|
||||
default_related_name = 'levels'
|
||||
ordering = ['altitude']
|
||||
ordering = ['ordering']
|
||||
|
||||
def __init__(self, *args, **kwargs):
|
||||
super().__init__(*args, **kwargs)
|
||||
|
@ -34,14 +34,14 @@ class Level(SpecificLocation, models.Model):
|
|||
raise TypeError
|
||||
if level_model is None:
|
||||
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):
|
||||
if self.on_top_of_id is not None:
|
||||
raise TypeError
|
||||
if level_model is None:
|
||||
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
|
||||
def sublevels(self):
|
||||
|
@ -63,7 +63,7 @@ class Level(SpecificLocation, models.Model):
|
|||
|
||||
def _serialize(self, level=True, **kwargs):
|
||||
result = super()._serialize(**kwargs)
|
||||
result['altitude'] = float(str(self.altitude))
|
||||
result['ordering'] = float(str(self.ordering))
|
||||
return result
|
||||
|
||||
def _render_space_ground(self, svg, space):
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue