From 207b74b445b1ba60cb6095985a8fefa92b592cfa Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Laura=20Kl=C3=BCnder?= Date: Sun, 4 Dec 2016 11:43:12 +0100 Subject: [PATCH] remove Obstacle.height and add Obstacle.crop_to_level --- src/c3nav/editor/forms.py | 9 ++++++- .../migrations/0011_auto_20161204_1041.py | 25 +++++++++++++++++++ src/c3nav/mapdata/models/geometry.py | 24 +++++++++--------- src/c3nav/mapdata/packageio/read.py | 1 + 4 files changed, 46 insertions(+), 13 deletions(-) create mode 100644 src/c3nav/mapdata/migrations/0011_auto_20161204_1041.py diff --git a/src/c3nav/editor/forms.py b/src/c3nav/editor/forms.py index c3ea2767..aeeb95b2 100644 --- a/src/c3nav/editor/forms.py +++ b/src/c3nav/editor/forms.py @@ -51,6 +51,13 @@ class MapitemFormMixin(ModelForm): if not creating: self.initial['level'] = self.instance.level.name + if 'crop_to_level' in self.fields: + # set field_name + self.fields['crop_to_level'].to_field_name = 'name' + if not creating and self.instance.crop_to_level is not None: + self.initial['crop_to_level'] = self.instance.crop_to_level.name + self.fields['crop_to_level'].queryset = self.fields['crop_to_level'].queryset.order_by('altitude') + if 'levels' in self.fields: # set field_name self.fields['levels'].to_field_name = 'name' @@ -93,7 +100,7 @@ class MapitemFormMixin(ModelForm): def create_editor_form(mapitemtype): possible_fields = ['name', 'package', 'altitude', 'level', 'intermediate', 'levels', 'geometry', - 'height', 'elevator', 'button'] + 'elevator', 'button', 'crop_to_level'] existing_fields = [field for field in possible_fields if hasattr(mapitemtype, field)] class EditorForm(MapitemFormMixin, ModelForm): diff --git a/src/c3nav/mapdata/migrations/0011_auto_20161204_1041.py b/src/c3nav/mapdata/migrations/0011_auto_20161204_1041.py new file mode 100644 index 00000000..d0636041 --- /dev/null +++ b/src/c3nav/mapdata/migrations/0011_auto_20161204_1041.py @@ -0,0 +1,25 @@ +# -*- coding: utf-8 -*- +# Generated by Django 1.10.4 on 2016-12-04 10:41 +from __future__ import unicode_literals + +from django.db import migrations, models +import django.db.models.deletion + + +class Migration(migrations.Migration): + + dependencies = [ + ('mapdata', '0010_auto_20161203_2139'), + ] + + operations = [ + migrations.RemoveField( + model_name='obstacle', + name='height', + ), + migrations.AddField( + model_name='obstacle', + name='crop_to_level', + field=models.ForeignKey(null=True, on_delete=django.db.models.deletion.CASCADE, related_name='crops_obstacles', to='mapdata.Level', verbose_name='crop to other level'), + ), + ] diff --git a/src/c3nav/mapdata/models/geometry.py b/src/c3nav/mapdata/models/geometry.py index b2c6baab..87087d08 100644 --- a/src/c3nav/mapdata/models/geometry.py +++ b/src/c3nav/mapdata/models/geometry.py @@ -184,7 +184,8 @@ class Obstacle(GeometryMapItemWithLevel): """ An obstacle """ - height = models.DecimalField(_('height of the obstacle'), null=True, max_digits=4, decimal_places=2) + crop_to_level = models.ForeignKey('mapdata.Level', on_delete=models.CASCADE, null=True, + verbose_name=_('crop to other level'), related_name='crops_obstacles') geomtype = 'polygon' @@ -193,26 +194,25 @@ class Obstacle(GeometryMapItemWithLevel): verbose_name_plural = _('Obstacles') default_related_name = 'obstacles' - def get_geojson_properties(self): - result = super().get_geojson_properties() - result['height'] = float(self.height) - return result - @classmethod def fromfile(cls, data, file_path): kwargs = super().fromfile(data, file_path) - if 'height' in data: - if not isinstance(data['height'], (int, float)): - raise ValueError('altitude has to be int or float.') - kwargs['height'] = data['height'] + if 'crop_to_level' in data: + kwargs['crop_to_level'] = data['crop_to_level'] return kwargs + def get_geojson_properties(self): + result = super().get_geojson_properties() + if self.crop_to_level is not None: + result['crop_to_level'] = self.crop_to_level.name + return result + def tofile(self): result = super().tofile() - if self.height is not None: - result['height'] = float(self.height) + if self.crop_to_level is not None: + result['crop_to_level'] = self.crop_to_level.name return result diff --git a/src/c3nav/mapdata/packageio/read.py b/src/c3nav/mapdata/packageio/read.py index 7ec666f8..fe6fb5c3 100644 --- a/src/c3nav/mapdata/packageio/read.py +++ b/src/c3nav/mapdata/packageio/read.py @@ -147,6 +147,7 @@ class ReaderItem: relations = { 'level': Level, + 'crop_to_level': Level, 'elevator': Elevator, }