team-3/src/c3nav/mapdata/models/geometry/section.py

104 lines
2.9 KiB
Python
Raw Normal View History

from collections import OrderedDict
2017-05-08 21:55:45 +02:00
from django.db import models
from django.utils.translation import ugettext_lazy as _
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-09 09:36:08 +02:00
SECTION_MODELS = OrderedDict()
2017-05-08 16:40:22 +02:00
class SectionGeometryMixin(GeometryMixin):
section = models.ForeignKey('mapdata.Section', on_delete=models.CASCADE, verbose_name=_('section'))
class Meta:
abstract = True
def get_geojson_properties(self):
result = super().get_geojson_properties()
2017-05-07 12:06:13 +02:00
result['section'] = self.section.id
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):
"""
The outline of a building on a specific level
"""
geometry = GeometryField('polygon')
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-09 13:48:55 +02:00
An accessible space. Shouldn't overlap with spaces on same secion and level.
"""
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)
category = models.CharField(verbose_name=_('category'), choices=CATEGORIES, default='', max_length=16)
class Meta:
2017-05-09 13:48:55 +02:00
verbose_name = _('Space')
verbose_name_plural = _('Spaces')
default_related_name = 'spaces'
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
result['public'] = self.public
return result
2017-05-09 13:48:55 +02:00
class Door(LevelSectionGeometryMixin, models.Model):
"""
2017-05-09 13:48:55 +02:00
A connection between two spaces
"""
geometry = GeometryField('polygon')
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):
"""
A hole in the ground of a section (all spaces with layer "normal" and buildings), e.g. for stairs.
"""
geometry = GeometryField('polygon')
class Meta:
verbose_name = _('Hole')
verbose_name_plural = _('Holes')
default_related_name = 'holes'