make altitudes reusable using GroundAltitude model

This commit is contained in:
Laura Klünder 2023-12-11 18:17:39 +01:00
parent c939c81c71
commit 97c9c7ecb7
8 changed files with 48 additions and 5 deletions

View file

@ -1,5 +1,6 @@
from c3nav.mapdata.models.update import MapUpdate # noqa
from c3nav.mapdata.models.access import AccessRestriction # noqa
from c3nav.mapdata.models.altitudes import GroundAltitude # noqa
from c3nav.mapdata.models.level import Level # noqa
from c3nav.mapdata.models.geometry.level import Building, Space, Door, AltitudeArea # noqa
from c3nav.mapdata.models.geometry.space import Area, Stair, Obstacle, LineObstacle, Hole, AltitudeMarker # noqa

View file

@ -0,0 +1,19 @@
from django.db import models
from django.utils.translation import gettext_lazy as _
class GroundAltitude(models.Model):
"""
A pre-defined ground altitude
"""
name = models.CharField(_('Name'), unique=True, max_length=70) # a slugfield would forbid periods
altitude = models.DecimalField(_('altitude'), null=False, max_digits=6, decimal_places=2)
class Meta:
verbose_name = _('Ground Altitude')
verbose_name_plural = _('Ground altitudes')
default_related_name = "groundaltitudes"
@property
def title(self):
return f'{self.name} ({self.altitude}m)'

View file

@ -218,7 +218,8 @@ class AltitudeArea(LevelGeometryMixin, models.Model):
spaces = {}
levels = Level.objects.prefetch_related('buildings', 'doors', 'spaces', 'spaces__columns',
'spaces__obstacles', 'spaces__lineobstacles', 'spaces__holes',
'spaces__stairs', 'spaces__ramps', 'spaces__altitudemarkers')
'spaces__stairs', 'spaces__ramps',
'spaces__altitudemarkers__groundaltitude')
logger = logging.getLogger('c3nav')
for level in levels:
@ -285,7 +286,7 @@ class AltitudeArea(LevelGeometryMixin, models.Model):
# give altitudes to areas
for space in level.spaces.all():
for altitudemarker in space.altitudemarkers.all():
for altitudemarker in space.altitudemarkers.select_related('groundaltitude').all():
for area in space_areas[space.pk]:
if area.geometry_prep.contains(unwrap_geom(altitudemarker.geometry)):
area.altitude = altitudemarker.altitude

View file

@ -298,16 +298,21 @@ class AltitudeMarker(SpaceGeometryMixin, models.Model):
An altitude marker
"""
geometry = GeometryField('point')
altitude = models.DecimalField(_('altitude'), null=False, max_digits=6, decimal_places=2)
groundaltitude = models.ForeignKey('mapdata.GroundAltitude', on_delete=models.CASCADE,
verbose_name=_('altitude'))
class Meta:
verbose_name = _('Altitude Marker')
verbose_name_plural = _('Altitude Markers')
default_related_name = 'altitudemarkers'
@property
def altitude(self) -> Decimal:
return self.groundaltitude.altitude
@property
def title(self):
return '%s (%sm)' % (super().title, self.altitude)
return f'#{self.pk}: {self.groundaltitude.title}'
class LeaveDescription(SerializableMixin):

View file