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-11 19:36:49 +02:00
|
|
|
SECTION_MODELS = []
|
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-11 19:36:49 +02:00
|
|
|
def get_geojson_properties(self) -> dict:
|
2017-05-06 17:24:09 +02:00
|
|
|
result = super().get_geojson_properties()
|
2017-06-11 12:29:12 +02:00
|
|
|
result['section'] = self.section_id
|
2017-05-21 23:39:26 +02:00
|
|
|
if hasattr(self, 'get_color'):
|
|
|
|
color = self.get_color()
|
|
|
|
if color:
|
|
|
|
result['color'] = color
|
2017-05-11 19:36:49 +02:00
|
|
|
return result
|
|
|
|
|
|
|
|
def _serialize(self, section=True, **kwargs):
|
|
|
|
result = super()._serialize(**kwargs)
|
|
|
|
if section:
|
|
|
|
result['section'] = self.section.id
|
2017-05-06 17:24:09 +02:00
|
|
|
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-26 20:25:24 +02:00
|
|
|
class Space(SpecificLocation, SectionGeometryMixin, models.Model):
|
2017-05-06 17:24:09 +02:00
|
|
|
"""
|
2017-06-10 14:58:13 +02:00
|
|
|
An accessible space. Shouldn't overlap with spaces on same section.
|
2017-05-06 17:24:09 +02:00
|
|
|
"""
|
|
|
|
CATEGORIES = (
|
2017-05-26 20:25:24 +02:00
|
|
|
('normal', _('normal')),
|
2017-05-06 17:24:09 +02:00
|
|
|
('stairs', _('stairs')),
|
|
|
|
('escalator', _('escalator')),
|
|
|
|
('elevator', _('elevator')),
|
|
|
|
)
|
2017-05-09 09:36:08 +02:00
|
|
|
geometry = GeometryField('polygon')
|
2017-05-26 20:25:24 +02:00
|
|
|
category = models.CharField(verbose_name=_('category'), choices=CATEGORIES, default='normal', max_length=16)
|
2017-06-11 13:18:25 +02:00
|
|
|
outside = models.BooleanField(default=False, verbose_name=_('only outside of building'))
|
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
|
|
|
|
2017-05-11 19:36:49 +02:00
|
|
|
def _serialize(self, space=True, **kwargs):
|
|
|
|
result = super()._serialize(**kwargs)
|
|
|
|
if space:
|
|
|
|
result['category'] = self.category
|
|
|
|
result['public'] = self.public
|
2017-05-06 17:24:09 +02:00
|
|
|
return result
|
|
|
|
|
2017-05-13 16:39:01 +02:00
|
|
|
def get_color(self):
|
2017-05-13 21:33:05 +02:00
|
|
|
color = super().get_color()
|
2017-05-13 16:39:01 +02:00
|
|
|
if not color:
|
2017-05-13 21:33:05 +02:00
|
|
|
color = {
|
|
|
|
'stairs': '#dddddd',
|
|
|
|
'escalator': '#bbbbbb',
|
|
|
|
'elevator': '#00ffff',
|
|
|
|
}.get(self.category)
|
2017-05-13 16:39:01 +02:00
|
|
|
return color
|
|
|
|
|
2017-05-06 17:24:09 +02:00
|
|
|
|
2017-05-26 20:25:24 +02:00
|
|
|
class Door(SectionGeometryMixin, 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'
|