new_serialize for obstacle and lineobstacle

This commit is contained in:
Laura Klünder 2024-12-04 11:35:03 +01:00
parent a1a350b96e
commit fca1ca5a32
2 changed files with 42 additions and 7 deletions

View file

@ -214,6 +214,8 @@ class Obstacle(SpaceGeometryMixin, models.Model):
"""
An obstacle
"""
new_serialize = True
group = models.ForeignKey(ObstacleGroup, null=True, blank=True, on_delete=models.SET_NULL)
geometry = GeometryField('polygon')
height = models.DecimalField(_('height'), max_digits=6, decimal_places=2, default=0.8,
@ -235,13 +237,10 @@ class Obstacle(SpaceGeometryMixin, models.Model):
result['color'] = color
return result
def _serialize(self, geometry=True, **kwargs):
result = super()._serialize(geometry=geometry, **kwargs)
result['height'] = float(str(self.height))
result['altitude'] = float(str(self.altitude))
@property
def color(self):
from c3nav.mapdata.render.theme import ColorManager
result['color'] = self.get_color(ColorManager.for_theme(None))
return result
return self.get_color(ColorManager.for_theme(None))
def get_color(self, color_manager: 'ThemeColorManager'):
return (
@ -255,6 +254,8 @@ class LineObstacle(SpaceGeometryMixin, models.Model):
"""
An obstacle that is a line with a specific width
"""
new_serialize = True
group = models.ForeignKey(ObstacleGroup, null=True, blank=True, on_delete=models.SET_NULL)
geometry = GeometryField('linestring')
width = models.DecimalField(_('width'), max_digits=4, decimal_places=2, default=0.15)
@ -288,6 +289,11 @@ class LineObstacle(SpaceGeometryMixin, models.Model):
result['buffered_geometry'] = format_geojson(mapping(self.buffered_geometry))
return result
@property
def color(self):
from c3nav.mapdata.render.theme import ColorManager
return self.get_color(ColorManager.for_theme(None))
def get_color(self, color_manager: 'ThemeColorManager'):
# TODO: should line obstacles use border color?
return (

View file

@ -5,9 +5,10 @@ from pydantic import Discriminator, Tag
from pydantic import Field as APIField
from pydantic import NonNegativeFloat, PositiveFloat, PositiveInt
from c3nav.api.schema import BaseSchema, GeometrySchema, PointSchema, AnyGeometrySchema
from c3nav.api.schema import BaseSchema, GeometrySchema, PointSchema, AnyGeometrySchema, PolygonSchema
from c3nav.api.utils import NonEmptyStr
from c3nav.mapdata.models import LocationGroup
from c3nav.mapdata.models.geometry.base import GeometryMixin
from c3nav.mapdata.schemas.model_base import (AnyLocationID, AnyPositionID, CustomLocationID, DjangoModelSchema,
LabelSettingsSchema, LocationSchema, PositionID,
SimpleGeometryLocationsSchema, SimpleGeometryPointAndBoundsSchema,
@ -16,6 +17,8 @@ from c3nav.mapdata.schemas.model_base import (AnyLocationID, AnyPositionID, Cust
WithLineStringGeometrySchema, WithPointGeometrySchema,
WithPolygonGeometrySchema, WithSpaceSchema, schema_definitions,
schema_description)
from c3nav.mapdata.utils.geometry import smart_mapping
from c3nav.mapdata.utils.json import format_geojson
class LevelSchema(SpecificLocationSchema, DjangoModelSchema):
@ -141,11 +144,37 @@ class LineObstacleSchema(WithLineStringGeometrySchema, BaseObstacleSchema):
"""
An obstacle to be subtracted from the accessible surface of a space, defined as a line with width.
"""
buffered_geometry: Union[
PolygonSchema,
Annotated[None, APIField(title="null", description="geometry not available of excluded from endpoint")]
] = APIField(
None,
title="buffered geometry",
description="line turned into a polygon with the given width, "
"can be null if not available or excluded from endpoint",
)
width: PositiveFloat = APIField(
title="width",
description="width of the line"
)
@classmethod
def get_overrides(cls, value) -> dict:
# todo: move into model
value: GeometryMixin
if "geometry" in value.get_deferred_fields() or value.geometry is None:
return {
**super().get_overrides(value),
"buffered_geometry": None,
}
return {
**super().get_overrides(value),
"buffered_geometry": (
format_geojson(smart_mapping(value.buffered_geometry), rounded=False)
if not getattr(value, '_hide_geometry', False) else None
),
}
class ColumnSchema(WithPolygonGeometrySchema, WithSpaceSchema, DjangoModelSchema):
"""