2016-08-29 18:49:24 +02:00
|
|
|
from django.db import models
|
2016-11-26 13:48:44 +01:00
|
|
|
from django.utils.functional import cached_property
|
2016-08-29 18:49:24 +02:00
|
|
|
from django.utils.translation import ugettext_lazy as _
|
2016-11-26 13:48:44 +01:00
|
|
|
from shapely.ops import cascaded_union
|
2016-08-29 18:49:24 +02:00
|
|
|
|
2016-11-14 21:15:20 +01:00
|
|
|
from c3nav.mapdata.models.base import MapItem
|
2016-08-29 18:49:24 +02:00
|
|
|
|
2016-10-12 15:25:00 +02:00
|
|
|
|
2016-11-14 21:15:20 +01:00
|
|
|
class Level(MapItem):
|
2016-08-29 18:49:24 +02:00
|
|
|
"""
|
|
|
|
A map level (-1, 0, 1, 2…)
|
|
|
|
"""
|
2016-10-11 16:33:12 +02:00
|
|
|
name = models.SlugField(_('level name'), unique=True, max_length=50,
|
2016-08-29 18:49:24 +02:00
|
|
|
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)
|
|
|
|
|
2016-10-12 15:25:00 +02:00
|
|
|
class Meta:
|
|
|
|
verbose_name = _('Level')
|
|
|
|
verbose_name_plural = _('Levels')
|
|
|
|
default_related_name = 'levels'
|
2016-09-24 14:09:52 +02:00
|
|
|
|
2016-11-26 13:48:44 +01:00
|
|
|
def __init__(self, *args, **kwargs):
|
|
|
|
super().__init__(*args, **kwargs)
|
|
|
|
self.geometries = LevelGeometries(self)
|
|
|
|
|
2016-09-24 15:36:14 +02:00
|
|
|
def tofilename(self):
|
|
|
|
return 'levels/%s.json' % self.name
|
|
|
|
|
2016-08-29 22:10:43 +02:00
|
|
|
@classmethod
|
2016-09-26 11:18:56 +02:00
|
|
|
def fromfile(cls, data, file_path):
|
2016-10-12 15:25:00 +02:00
|
|
|
kwargs = super().fromfile(data, file_path)
|
|
|
|
|
2016-08-29 22:10:43 +02:00
|
|
|
if 'altitude' not in data:
|
2016-09-24 14:09:52 +02:00
|
|
|
raise ValueError('missing altitude.')
|
2016-08-29 22:10:43 +02:00
|
|
|
|
|
|
|
if not isinstance(data['altitude'], (int, float)):
|
2016-09-24 14:09:52 +02:00
|
|
|
raise ValueError('altitude has to be int or float.')
|
2016-08-29 22:10:43 +02:00
|
|
|
|
2016-10-12 15:25:00 +02:00
|
|
|
kwargs['altitude'] = data['altitude']
|
|
|
|
|
|
|
|
return kwargs
|
2016-08-29 22:10:43 +02:00
|
|
|
|
2016-08-30 13:58:45 +02:00
|
|
|
def tofile(self):
|
2016-10-12 15:25:00 +02:00
|
|
|
result = super().tofile()
|
|
|
|
result['altitude'] = float(self.altitude)
|
|
|
|
return result
|
2016-11-26 13:48:44 +01:00
|
|
|
|
|
|
|
|
|
|
|
class LevelGeometries():
|
|
|
|
def __init__(self, level):
|
|
|
|
self.level = level
|
|
|
|
|
|
|
|
@cached_property
|
|
|
|
def buildings(self):
|
|
|
|
return cascaded_union([building.geometry for building in self.level.buildings.all()])
|
|
|
|
|
|
|
|
@cached_property
|
|
|
|
def areas(self):
|
|
|
|
return cascaded_union([area.geometry for area in self.level.areas.all()])
|