make altitudes reusable using GroundAltitude model
This commit is contained in:
parent
c939c81c71
commit
97c9c7ecb7
8 changed files with 48 additions and 5 deletions
|
@ -136,6 +136,9 @@ class EditorFormBase(I18nModelFormMixin, ModelForm):
|
||||||
if 'category' in self.fields:
|
if 'category' in self.fields:
|
||||||
self.fields['category'].label_from_instance = attrgetter('title')
|
self.fields['category'].label_from_instance = attrgetter('title')
|
||||||
|
|
||||||
|
if 'groundaltitude' in self.fields:
|
||||||
|
self.fields['groundaltitude'].label_from_instance = attrgetter('title')
|
||||||
|
|
||||||
if 'label_settings' in self.fields:
|
if 'label_settings' in self.fields:
|
||||||
self.fields['label_settings'].label_from_instance = attrgetter('title')
|
self.fields['label_settings'].label_from_instance = attrgetter('title')
|
||||||
|
|
||||||
|
@ -289,7 +292,7 @@ def create_editor_form(editor_model):
|
||||||
'walk', 'ordering', 'category', 'width', 'groups', 'height', 'color', 'priority', 'hierarchy',
|
'walk', 'ordering', 'category', 'width', 'groups', 'height', 'color', 'priority', 'hierarchy',
|
||||||
'icon_name', 'base_altitude', 'waytype', 'access_restriction', 'default_height', 'door_height',
|
'icon_name', 'base_altitude', 'waytype', 'access_restriction', 'default_height', 'door_height',
|
||||||
'outside', 'can_search', 'can_describe', 'geometry', 'single', 'altitude', 'short_label',
|
'outside', 'can_search', 'can_describe', 'geometry', 'single', 'altitude', 'short_label',
|
||||||
'origin_space', 'target_space', 'data', 'comment', 'slow_down_factor', ''
|
'origin_space', 'target_space', 'data', 'comment', 'slow_down_factor', 'groundaltitude',
|
||||||
'extra_seconds', 'speed', 'description', 'speed_up', 'description_up', 'enter_description',
|
'extra_seconds', 'speed', 'description', 'speed_up', 'description_up', 'enter_description',
|
||||||
'level_change_description', 'base_mapdata_accessible', 'can_report_missing',
|
'level_change_description', 'base_mapdata_accessible', 'can_report_missing',
|
||||||
'label_settings', 'label_override', 'min_zoom', 'max_zoom', 'font_size',
|
'label_settings', 'label_override', 'min_zoom', 'max_zoom', 'font_size',
|
||||||
|
|
|
@ -59,6 +59,7 @@ urlpatterns.extend(add_editor_urls('LocationGroupCategory'))
|
||||||
urlpatterns.extend(add_editor_urls('LocationGroup'))
|
urlpatterns.extend(add_editor_urls('LocationGroup'))
|
||||||
urlpatterns.extend(add_editor_urls('DynamicLocation'))
|
urlpatterns.extend(add_editor_urls('DynamicLocation'))
|
||||||
urlpatterns.extend(add_editor_urls('WayType'))
|
urlpatterns.extend(add_editor_urls('WayType'))
|
||||||
|
urlpatterns.extend(add_editor_urls('GroundAltitude'))
|
||||||
urlpatterns.extend(add_editor_urls('AccessRestriction'))
|
urlpatterns.extend(add_editor_urls('AccessRestriction'))
|
||||||
urlpatterns.extend(add_editor_urls('AccessRestrictionGroup'))
|
urlpatterns.extend(add_editor_urls('AccessRestrictionGroup'))
|
||||||
urlpatterns.extend(add_editor_urls('Source'))
|
urlpatterns.extend(add_editor_urls('Source'))
|
||||||
|
|
|
@ -51,6 +51,7 @@ def main_index(request):
|
||||||
'child_models': [
|
'child_models': [
|
||||||
child_model(request, 'LocationGroupCategory'),
|
child_model(request, 'LocationGroupCategory'),
|
||||||
child_model(request, 'LocationGroup'),
|
child_model(request, 'LocationGroup'),
|
||||||
|
child_model(request, 'GroundAltitude'),
|
||||||
child_model(request, 'DynamicLocation'),
|
child_model(request, 'DynamicLocation'),
|
||||||
child_model(request, 'WayType'),
|
child_model(request, 'WayType'),
|
||||||
child_model(request, 'AccessRestriction'),
|
child_model(request, 'AccessRestriction'),
|
||||||
|
@ -472,6 +473,10 @@ def list_objects(request, model=None, level=None, space=None, explicit_edit=Fals
|
||||||
model._meta.get_field('target_space')
|
model._meta.get_field('target_space')
|
||||||
queryset = queryset.select_related('target_space')
|
queryset = queryset.select_related('target_space')
|
||||||
|
|
||||||
|
with suppress(FieldDoesNotExist):
|
||||||
|
model._meta.get_field('altitude')
|
||||||
|
add_cols.append('altitude')
|
||||||
|
|
||||||
ctx.update({
|
ctx.update({
|
||||||
'levels': Level.objects.filter(Level.q_for_request(request), on_top_of__isnull=True),
|
'levels': Level.objects.filter(Level.q_for_request(request), on_top_of__isnull=True),
|
||||||
'level': space.level,
|
'level': space.level,
|
||||||
|
@ -492,6 +497,14 @@ def list_objects(request, model=None, level=None, space=None, explicit_edit=Fals
|
||||||
add_cols.append('priority')
|
add_cols.append('priority')
|
||||||
queryset = queryset.order_by('-priority')
|
queryset = queryset.order_by('-priority')
|
||||||
|
|
||||||
|
with suppress(FieldDoesNotExist):
|
||||||
|
model._meta.get_field('altitude')
|
||||||
|
add_cols.append('altitude')
|
||||||
|
|
||||||
|
with suppress(FieldDoesNotExist):
|
||||||
|
model._meta.get_field('groundaltitude')
|
||||||
|
queryset = queryset.select_related('groundaltitude')
|
||||||
|
|
||||||
ctx.update({
|
ctx.update({
|
||||||
'back_url': reverse('editor.index'),
|
'back_url': reverse('editor.index'),
|
||||||
'back_title': _('back to overview'),
|
'back_title': _('back to overview'),
|
||||||
|
|
|
@ -1,5 +1,6 @@
|
||||||
from c3nav.mapdata.models.update import MapUpdate # noqa
|
from c3nav.mapdata.models.update import MapUpdate # noqa
|
||||||
from c3nav.mapdata.models.access import AccessRestriction # 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.level import Level # noqa
|
||||||
from c3nav.mapdata.models.geometry.level import Building, Space, Door, AltitudeArea # 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
|
from c3nav.mapdata.models.geometry.space import Area, Stair, Obstacle, LineObstacle, Hole, AltitudeMarker # noqa
|
||||||
|
|
19
src/c3nav/mapdata/models/altitudes.py
Normal file
19
src/c3nav/mapdata/models/altitudes.py
Normal 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)'
|
|
@ -218,7 +218,8 @@ class AltitudeArea(LevelGeometryMixin, models.Model):
|
||||||
spaces = {}
|
spaces = {}
|
||||||
levels = Level.objects.prefetch_related('buildings', 'doors', 'spaces', 'spaces__columns',
|
levels = Level.objects.prefetch_related('buildings', 'doors', 'spaces', 'spaces__columns',
|
||||||
'spaces__obstacles', 'spaces__lineobstacles', 'spaces__holes',
|
'spaces__obstacles', 'spaces__lineobstacles', 'spaces__holes',
|
||||||
'spaces__stairs', 'spaces__ramps', 'spaces__altitudemarkers')
|
'spaces__stairs', 'spaces__ramps',
|
||||||
|
'spaces__altitudemarkers__groundaltitude')
|
||||||
logger = logging.getLogger('c3nav')
|
logger = logging.getLogger('c3nav')
|
||||||
|
|
||||||
for level in levels:
|
for level in levels:
|
||||||
|
@ -285,7 +286,7 @@ class AltitudeArea(LevelGeometryMixin, models.Model):
|
||||||
|
|
||||||
# give altitudes to areas
|
# give altitudes to areas
|
||||||
for space in level.spaces.all():
|
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]:
|
for area in space_areas[space.pk]:
|
||||||
if area.geometry_prep.contains(unwrap_geom(altitudemarker.geometry)):
|
if area.geometry_prep.contains(unwrap_geom(altitudemarker.geometry)):
|
||||||
area.altitude = altitudemarker.altitude
|
area.altitude = altitudemarker.altitude
|
||||||
|
|
|
@ -298,16 +298,21 @@ class AltitudeMarker(SpaceGeometryMixin, models.Model):
|
||||||
An altitude marker
|
An altitude marker
|
||||||
"""
|
"""
|
||||||
geometry = GeometryField('point')
|
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:
|
class Meta:
|
||||||
verbose_name = _('Altitude Marker')
|
verbose_name = _('Altitude Marker')
|
||||||
verbose_name_plural = _('Altitude Markers')
|
verbose_name_plural = _('Altitude Markers')
|
||||||
default_related_name = 'altitudemarkers'
|
default_related_name = 'altitudemarkers'
|
||||||
|
|
||||||
|
@property
|
||||||
|
def altitude(self) -> Decimal:
|
||||||
|
return self.groundaltitude.altitude
|
||||||
|
|
||||||
@property
|
@property
|
||||||
def title(self):
|
def title(self):
|
||||||
return '%s (%sm)' % (super().title, self.altitude)
|
return f'#{self.pk}: {self.groundaltitude.title}'
|
||||||
|
|
||||||
|
|
||||||
class LeaveDescription(SerializableMixin):
|
class LeaveDescription(SerializableMixin):
|
||||||
|
|
0
src/c3nav/mapdata/utils/dataformats.py
Normal file
0
src/c3nav/mapdata/utils/dataformats.py
Normal file
Loading…
Add table
Add a link
Reference in a new issue