new_serialize for obstacle and lineobstacle
This commit is contained in:
parent
a1a350b96e
commit
fca1ca5a32
2 changed files with 42 additions and 7 deletions
|
@ -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 (
|
||||||
|
|
|
@ -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):
|
||||||
"""
|
"""
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue