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'))