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

83 lines
2.5 KiB
Python
Raw Normal View History

from django.db import models
from django.utils.translation import ugettext_lazy as _
from c3nav.mapdata.fields import GeometryField
2017-08-05 12:13:15 +02:00
from c3nav.mapdata.models import Level
2017-07-13 23:49:00 +02:00
from c3nav.mapdata.models.access import AccessRestrictionMixin
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-06-11 14:43:14 +02:00
class LevelGeometryMixin(GeometryMixin):
level = models.ForeignKey('mapdata.Level', on_delete=models.CASCADE, verbose_name=_('level'))
class Meta:
abstract = True
def get_geojson_properties(self, *args, instance=None, **kwargs) -> dict:
result = super().get_geojson_properties(*args, **kwargs)
2017-06-11 14:43:14 +02:00
result['level'] = self.level_id
if hasattr(self, 'get_color'):
color = self.get_color(instance=instance)
if color:
result['color'] = color
if hasattr(self, 'opacity'):
result['opacity'] = self.opacity
2017-05-11 19:36:49 +02:00
return result
2017-06-11 14:43:14 +02:00
def _serialize(self, level=True, **kwargs):
2017-05-11 19:36:49 +02:00
result = super()._serialize(**kwargs)
2017-06-11 14:43:14 +02:00
if level:
result['level'] = self.level_id
return result
2017-06-11 14:43:14 +02:00
class Building(LevelGeometryMixin, 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-06-11 14:43:14 +02:00
class Space(SpecificLocation, LevelGeometryMixin, models.Model):
"""
2017-06-11 14:43:14 +02:00
An accessible space. Shouldn't overlap with spaces on the same level.
"""
2017-05-09 09:36:08 +02:00
geometry = GeometryField('polygon')
outside = models.BooleanField(default=False, verbose_name=_('only outside of building'))
class Meta:
2017-05-09 13:48:55 +02:00
verbose_name = _('Space')
verbose_name_plural = _('Spaces')
default_related_name = 'spaces'
2017-07-13 23:49:00 +02:00
class Door(AccessRestrictionMixin, LevelGeometryMixin, 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-08-05 11:56:29 +02:00
class AltitudeArea(LevelGeometryMixin, models.Model):
"""
An altitude area
"""
geometry = GeometryField('polygon')
altitude = models.DecimalField(_('altitude'), null=False, max_digits=6, decimal_places=2)
class Meta:
verbose_name = _('Altitude Area')
verbose_name_plural = _('Altitude Areas')
default_related_name = 'altitudeareas'