diff --git a/src/c3nav/editor/forms.py b/src/c3nav/editor/forms.py
index 9e264b17..a3b7cbfd 100644
--- a/src/c3nav/editor/forms.py
+++ b/src/c3nav/editor/forms.py
@@ -3,6 +3,7 @@ import time
from collections import OrderedDict
from django.conf import settings
+from django.db.models import Field
from django.forms import CharField, ModelForm, ValidationError
from django.forms.models import ModelChoiceField
from django.forms.widgets import HiddenInput
@@ -108,8 +109,8 @@ class MapitemFormMixin(ModelForm):
def create_editor_form(mapitemtype):
possible_fields = ['name', 'package', 'altitude', 'level', 'intermediate', 'levels', 'geometry',
- 'elevator', 'button', 'crop_to_level', 'width', 'groups']
- existing_fields = [field for field in possible_fields if hasattr(mapitemtype, field)]
+ 'elevator', 'button', 'crop_to_level', 'width', 'groups', 'override_altitude']
+ existing_fields = [field for field in possible_fields if isinstance(getattr(mapitemtype, field, None), Field)]
class EditorForm(MapitemFormMixin, ModelForm):
class Meta:
diff --git a/src/c3nav/editor/templates/editor/mapitems.html b/src/c3nav/editor/templates/editor/mapitems.html
index 999e0ffa..e2c9b03c 100644
--- a/src/c3nav/editor/templates/editor/mapitems.html
+++ b/src/c3nav/editor/templates/editor/mapitems.html
@@ -13,10 +13,11 @@
{% endif %}
-
{% if item.title != item.name %}{{ item.title }} {{ item.name }}{% else %}{{ item.name }}{% endif %} |
{% if has_elevator %}
{{ item.elevator }} |
+ {{ item.button }} |
+ {% if item.override_altitude %}{{ item.override_altitude }} m{% endif %} |
{% endif %}
{% if has_levels %}
{% for level in item.levels.all %}{% if not forloop.first %}, {% endif %}{{ level.name }}{% endfor %} |
diff --git a/src/c3nav/mapdata/migrations/0021_auto_20161217_2333.py b/src/c3nav/mapdata/migrations/0021_auto_20161217_2333.py
new file mode 100644
index 00000000..0246b442
--- /dev/null
+++ b/src/c3nav/mapdata/migrations/0021_auto_20161217_2333.py
@@ -0,0 +1,26 @@
+# -*- coding: utf-8 -*-
+# Generated by Django 1.10.4 on 2016-12-17 23:33
+from __future__ import unicode_literals
+
+from django.db import migrations, models
+
+
+class Migration(migrations.Migration):
+
+ dependencies = [
+ ('mapdata', '0020_auto_20161216_0934'),
+ ]
+
+ operations = [
+ migrations.AddField(
+ model_name='elevatorlevel',
+ name='override_altitude',
+ field=models.DecimalField(decimal_places=2, max_digits=6, null=True, verbose_name='override level altitude'),
+ ),
+ migrations.AlterField(
+ model_name='level',
+ name='altitude',
+ field=models.DecimalField(decimal_places=2, default=0, max_digits=6, unique=True, verbose_name='level altitude'),
+ preserve_default=False,
+ ),
+ ]
diff --git a/src/c3nav/mapdata/models/geometry.py b/src/c3nav/mapdata/models/geometry.py
index 70c49c5f..65e63b22 100644
--- a/src/c3nav/mapdata/models/geometry.py
+++ b/src/c3nav/mapdata/models/geometry.py
@@ -1,6 +1,7 @@
from collections import OrderedDict
from django.db import models
+from django.utils.functional import cached_property
from django.utils.translation import ugettext_lazy as _
from shapely.geometry import CAP_STYLE, JOIN_STYLE
from shapely.geometry.geo import mapping, shape
@@ -321,6 +322,7 @@ class ElevatorLevel(GeometryMapItemWithLevel):
"""
elevator = models.ForeignKey(Elevator, on_delete=models.PROTECT)
button = models.SlugField(_('Button label'), max_length=10)
+ override_altitude = models.DecimalField(_('override level altitude'), null=True, max_digits=6, decimal_places=2)
geomtype = 'polygon'
@@ -347,10 +349,21 @@ class ElevatorLevel(GeometryMapItemWithLevel):
raise ValueError('missing button.')
kwargs['button'] = data['button']
+ if 'override_altitude' in data:
+ kwargs['override_altitude'] = data['override_altitude']
+
return kwargs
def tofile(self):
result = super().tofile()
result['elevator'] = self.elevator.name
result['button'] = self.button
+ if self.override_altitude is not None:
+ result['override_altitude'] = float(self.override_altitude)
return result
+
+ @cached_property
+ def altitude(self):
+ if self.override_altitude is not None:
+ return self.override_altitude
+ return self.level.altitude
diff --git a/src/c3nav/mapdata/models/level.py b/src/c3nav/mapdata/models/level.py
index ccc548c2..9b2cbdcc 100644
--- a/src/c3nav/mapdata/models/level.py
+++ b/src/c3nav/mapdata/models/level.py
@@ -14,7 +14,7 @@ class Level(MapItem):
"""
name = models.SlugField(_('level name'), unique=True, max_length=50,
help_text=_('Usually just an integer (e.g. -1, 0, 1, 2)'))
- altitude = models.DecimalField(_('level altitude'), null=True, max_digits=6, decimal_places=2)
+ altitude = models.DecimalField(_('level altitude'), null=False, unique=True, max_digits=6, decimal_places=2)
intermediate = models.BooleanField(_('intermediate level'))
class Meta:
diff --git a/src/c3nav/routing/graph.py b/src/c3nav/routing/graph.py
index faeb5168..daa8178e 100644
--- a/src/c3nav/routing/graph.py
+++ b/src/c3nav/routing/graph.py
@@ -132,7 +132,7 @@ class Graph:
room.level._built_room_transfer_points.append(center_point)
room.level._built_points.append(center_point)
- direction_up = level2.level.altitude > level1.level.altitude
+ direction_up = level2.altitude > level1.altitude
point1.connect_to(center_point, ctype=('elevator_up' if direction_up else 'elevator_down'))
center_point.connect_to(point2, ctype=('elevator_up' if direction_up else 'elevator_down'))