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

View file

@ -5,9 +5,10 @@ from pydantic import Discriminator, Tag
from pydantic import Field as APIField from pydantic import Field as APIField
from pydantic import NonNegativeFloat, PositiveFloat, PositiveInt 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.api.utils import NonEmptyStr
from c3nav.mapdata.models import LocationGroup 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, from c3nav.mapdata.schemas.model_base import (AnyLocationID, AnyPositionID, CustomLocationID, DjangoModelSchema,
LabelSettingsSchema, LocationSchema, PositionID, LabelSettingsSchema, LocationSchema, PositionID,
SimpleGeometryLocationsSchema, SimpleGeometryPointAndBoundsSchema, SimpleGeometryLocationsSchema, SimpleGeometryPointAndBoundsSchema,
@ -16,6 +17,8 @@ from c3nav.mapdata.schemas.model_base import (AnyLocationID, AnyPositionID, Cust
WithLineStringGeometrySchema, WithPointGeometrySchema, WithLineStringGeometrySchema, WithPointGeometrySchema,
WithPolygonGeometrySchema, WithSpaceSchema, schema_definitions, WithPolygonGeometrySchema, WithSpaceSchema, schema_definitions,
schema_description) schema_description)
from c3nav.mapdata.utils.geometry import smart_mapping
from c3nav.mapdata.utils.json import format_geojson
class LevelSchema(SpecificLocationSchema, DjangoModelSchema): 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. 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( width: PositiveFloat = APIField(
title="width", title="width",
description="width of the line" 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): class ColumnSchema(WithPolygonGeometrySchema, WithSpaceSchema, DjangoModelSchema):
""" """