2017-05-06 17:24:09 +02:00
|
|
|
from collections import OrderedDict
|
2017-05-08 21:55:45 +02:00
|
|
|
|
2017-05-06 17:24:09 +02:00
|
|
|
from django.db import models
|
|
|
|
from django.utils.translation import ugettext_lazy as _
|
|
|
|
|
2017-05-08 16:05:44 +02:00
|
|
|
from c3nav.mapdata.fields import GeometryField
|
2017-05-08 16:40:22 +02:00
|
|
|
from c3nav.mapdata.models.geometry.base import GeometryMixin
|
2017-05-10 18:03:57 +02:00
|
|
|
from c3nav.mapdata.models.locations import SpecificLocation
|
2017-05-06 17:24:09 +02:00
|
|
|
|
2017-05-09 09:36:08 +02:00
|
|
|
SECTION_MODELS = OrderedDict()
|
2017-05-06 17:24:09 +02:00
|
|
|
|
|
|
|
|
2017-05-08 16:40:22 +02:00
|
|
|
class SectionGeometryMixin(GeometryMixin):
|
2017-05-09 12:50:32 +02:00
|
|
|
section = models.ForeignKey('mapdata.Section', on_delete=models.CASCADE, verbose_name=_('section'))
|
|
|
|
|
|
|
|
class Meta:
|
|
|
|
abstract = True
|
|
|
|
|
2017-05-06 17:24:09 +02:00
|
|
|
def get_geojson_properties(self):
|
|
|
|
result = super().get_geojson_properties()
|
2017-05-07 12:06:13 +02:00
|
|
|
result['section'] = self.section.id
|
2017-05-06 17:24:09 +02:00
|
|
|
return result
|
|
|
|
|
|
|
|
|
2017-05-09 13:48:55 +02:00
|
|
|
class LevelSectionGeometryMixin(SectionGeometryMixin):
|
|
|
|
LEVELS = (
|
|
|
|
('', _('normal')),
|
|
|
|
('upper', _('upper')),
|
|
|
|
('lower', _('lower')),
|
|
|
|
)
|
|
|
|
level = models.CharField(verbose_name=_('level'), choices=LEVELS, default='', max_length=16)
|
|
|
|
|
|
|
|
class Meta:
|
|
|
|
abstract = True
|
|
|
|
|
|
|
|
def get_geojson_properties(self):
|
|
|
|
result = super().get_geojson_properties()
|
|
|
|
result['level'] = self.level
|
|
|
|
return result
|
|
|
|
|
|
|
|
|
2017-05-08 16:40:22 +02:00
|
|
|
class Building(SectionGeometryMixin, models.Model):
|
2017-05-06 17:24:09 +02:00
|
|
|
"""
|
|
|
|
The outline of a building on a specific level
|
|
|
|
"""
|
2017-05-08 16:05:44 +02:00
|
|
|
geometry = GeometryField('polygon')
|
2017-05-06 17:24:09 +02:00
|
|
|
|
|
|
|
class Meta:
|
|
|
|
verbose_name = _('Building')
|
|
|
|
verbose_name_plural = _('Buildings')
|
|
|
|
default_related_name = 'buildings'
|
|
|
|
|
|
|
|
|
2017-05-10 18:03:57 +02:00
|
|
|
class Space(SpecificLocation, LevelSectionGeometryMixin, models.Model):
|
2017-05-06 17:24:09 +02:00
|
|
|
"""
|
2017-05-09 13:48:55 +02:00
|
|
|
An accessible space. Shouldn't overlap with spaces on same secion and level.
|
2017-05-06 17:24:09 +02:00
|
|
|
"""
|
|
|
|
|
|
|
|
CATEGORIES = (
|
|
|
|
('', _('normal')),
|
|
|
|
('stairs', _('stairs')),
|
|
|
|
('escalator', _('escalator')),
|
|
|
|
('elevator', _('elevator')),
|
|
|
|
)
|
2017-05-09 09:36:08 +02:00
|
|
|
geometry = GeometryField('polygon')
|
2017-05-06 17:50:55 +02:00
|
|
|
public = models.BooleanField(verbose_name=_('public'), default=True)
|
2017-05-09 13:20:25 +02:00
|
|
|
category = models.CharField(verbose_name=_('category'), choices=CATEGORIES, default='', max_length=16)
|
2017-05-06 17:24:09 +02:00
|
|
|
|
|
|
|
class Meta:
|
2017-05-09 13:48:55 +02:00
|
|
|
verbose_name = _('Space')
|
|
|
|
verbose_name_plural = _('Spaces')
|
|
|
|
default_related_name = 'spaces'
|
2017-05-06 17:24:09 +02:00
|
|
|
|
|
|
|
def get_geojson_properties(self):
|
|
|
|
result = super().get_geojson_properties()
|
|
|
|
result['category'] = self.category
|
2017-05-09 13:42:09 +02:00
|
|
|
result['level'] = self.level
|
2017-05-06 17:24:09 +02:00
|
|
|
result['public'] = self.public
|
|
|
|
return result
|
|
|
|
|
|
|
|
|
2017-05-09 13:48:55 +02:00
|
|
|
class Door(LevelSectionGeometryMixin, models.Model):
|
2017-05-06 17:24:09 +02:00
|
|
|
"""
|
2017-05-09 13:48:55 +02:00
|
|
|
A connection between two spaces
|
2017-05-06 17:24:09 +02:00
|
|
|
"""
|
2017-05-08 16:05:44 +02:00
|
|
|
geometry = GeometryField('polygon')
|
2017-05-06 17:24:09 +02:00
|
|
|
|
|
|
|
class Meta:
|
|
|
|
verbose_name = _('Door')
|
|
|
|
verbose_name_plural = _('Doors')
|
|
|
|
default_related_name = 'doors'
|
|
|
|
|
|
|
|
|
2017-05-08 16:40:22 +02:00
|
|
|
class Hole(SectionGeometryMixin, models.Model):
|
2017-05-06 17:24:09 +02:00
|
|
|
"""
|
2017-05-09 13:20:25 +02:00
|
|
|
A hole in the ground of a section (all spaces with layer "normal" and buildings), e.g. for stairs.
|
2017-05-06 17:24:09 +02:00
|
|
|
"""
|
2017-05-08 16:05:44 +02:00
|
|
|
geometry = GeometryField('polygon')
|
2017-05-06 17:24:09 +02:00
|
|
|
|
|
|
|
class Meta:
|
|
|
|
verbose_name = _('Hole')
|
|
|
|
verbose_name_plural = _('Holes')
|
|
|
|
default_related_name = 'holes'
|