use new serializer for buildings
This commit is contained in:
parent
1210b69bbf
commit
c0e6b02dc2
2 changed files with 30 additions and 3 deletions
|
@ -106,6 +106,8 @@ class Building(LevelGeometryMixin, models.Model):
|
||||||
"""
|
"""
|
||||||
The outline of a building on a specific level
|
The outline of a building on a specific level
|
||||||
"""
|
"""
|
||||||
|
new_serialize = True
|
||||||
|
|
||||||
geometry = GeometryField('polygon')
|
geometry = GeometryField('polygon')
|
||||||
|
|
||||||
class Meta:
|
class Meta:
|
||||||
|
|
|
@ -1,3 +1,4 @@
|
||||||
|
import math
|
||||||
import re
|
import re
|
||||||
from typing import Annotated, Optional, Union
|
from typing import Annotated, Optional, Union
|
||||||
|
|
||||||
|
@ -6,6 +7,9 @@ from pydantic import PositiveInt
|
||||||
|
|
||||||
from c3nav.api.schema import BaseSchema, LineStringSchema, PointSchema, PolygonSchema
|
from c3nav.api.schema import BaseSchema, LineStringSchema, PointSchema, PolygonSchema
|
||||||
from c3nav.api.utils import NonEmptyStr
|
from c3nav.api.utils import NonEmptyStr
|
||||||
|
from c3nav.mapdata.models.geometry.base import GeometryMixin
|
||||||
|
from c3nav.mapdata.utils.geometry import smart_mapping
|
||||||
|
from c3nav.mapdata.utils.json import format_geojson
|
||||||
|
|
||||||
|
|
||||||
def schema_description(schema):
|
def schema_description(schema):
|
||||||
|
@ -217,7 +221,28 @@ class SpecificLocationSchema(LocationSchema):
|
||||||
)
|
)
|
||||||
|
|
||||||
|
|
||||||
class WithPolygonGeometrySchema(BaseSchema):
|
class WithGeometrySchema(BaseSchema):
|
||||||
|
@classmethod
|
||||||
|
def get_overrides(cls, value) -> dict:
|
||||||
|
value: GeometryMixin
|
||||||
|
if "geometry" in value.get_deferred_fields():
|
||||||
|
return {
|
||||||
|
**super().get_overrides(value),
|
||||||
|
"geometry": None,
|
||||||
|
"point": None,
|
||||||
|
"bounds": None,
|
||||||
|
}
|
||||||
|
minx, miny, maxx, maxy = value.geometry.bounds
|
||||||
|
return {
|
||||||
|
**super().get_overrides(value),
|
||||||
|
"geometry": format_geojson(smart_mapping(value.geometry), rounded=False),
|
||||||
|
"point": (value.level_id,) + tuple(round(i, 2) for i in value.point.coords[0]),
|
||||||
|
"bounds": ((int(math.floor(minx)), int(math.floor(miny))),
|
||||||
|
(int(math.ceil(maxx)), int(math.ceil(maxy))))
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
class WithPolygonGeometrySchema(WithGeometrySchema):
|
||||||
geometry: Union[
|
geometry: Union[
|
||||||
PolygonSchema,
|
PolygonSchema,
|
||||||
Annotated[None, APIField(title="null", description="geometry not available of excluded from endpoint")]
|
Annotated[None, APIField(title="null", description="geometry not available of excluded from endpoint")]
|
||||||
|
@ -228,7 +253,7 @@ class WithPolygonGeometrySchema(BaseSchema):
|
||||||
)
|
)
|
||||||
|
|
||||||
|
|
||||||
class WithLineStringGeometrySchema(BaseSchema):
|
class WithLineStringGeometrySchema(WithGeometrySchema):
|
||||||
geometry: Union[
|
geometry: Union[
|
||||||
LineStringSchema,
|
LineStringSchema,
|
||||||
Annotated[None, APIField(title="null", description="geometry not available of excluded from endpoint")]
|
Annotated[None, APIField(title="null", description="geometry not available of excluded from endpoint")]
|
||||||
|
@ -239,7 +264,7 @@ class WithLineStringGeometrySchema(BaseSchema):
|
||||||
)
|
)
|
||||||
|
|
||||||
|
|
||||||
class WithPointGeometrySchema(BaseSchema):
|
class WithPointGeometrySchema(WithGeometrySchema):
|
||||||
geometry: Union[
|
geometry: Union[
|
||||||
PointSchema,
|
PointSchema,
|
||||||
Annotated[None, APIField(title="null", description="geometry not available of excluded from endpoint")]
|
Annotated[None, APIField(title="null", description="geometry not available of excluded from endpoint")]
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue