remove geometry from serialized data using filter parameter

This commit is contained in:
Laura Klünder 2023-11-23 18:41:46 +01:00
parent 3fd5c49926
commit fc53e3197d
6 changed files with 35 additions and 17 deletions

View file

@ -78,13 +78,15 @@ class GeometryMixin(SerializableMixin):
@cached_property @cached_property
def point(self): def point(self):
if "geometry" in self.get_deferred_fields():
raise ValueError
return good_representative_point(self.geometry) return good_representative_point(self.geometry)
def _serialize(self, geometry=True, simple_geometry=False, **kwargs): def _serialize(self, geometry=True, simple_geometry=False, **kwargs):
result = super()._serialize(simple_geometry=simple_geometry, **kwargs) result = super()._serialize(simple_geometry=simple_geometry, **kwargs)
if geometry and "geometry" not in self.get_deferred_fields(): if geometry and "geometry" not in self.get_deferred_fields():
result['geometry'] = format_geojson(smart_mapping(self.geometry), rounded=False) result['geometry'] = format_geojson(smart_mapping(self.geometry), rounded=False)
if simple_geometry: if simple_geometry and "geometry" not in self.get_deferred_fields():
result['point'] = (self.level_id, ) + tuple(round(i, 2) for i in self.point.coords[0]) result['point'] = (self.level_id, ) + tuple(round(i, 2) for i in self.point.coords[0])
if not isinstance(self.geometry, Point): if not isinstance(self.geometry, Point):
self.geometry: BaseGeometry self.geometry: BaseGeometry
@ -99,6 +101,8 @@ class GeometryMixin(SerializableMixin):
return result return result
def get_geometry(self, detailed_geometry=True): def get_geometry(self, detailed_geometry=True):
if "geometry" in self.get_deferred_fields():
return None
if detailed_geometry: if detailed_geometry:
return format_geojson(smart_mapping(self.geometry), rounded=False) return format_geojson(smart_mapping(self.geometry), rounded=False)
return format_geojson(smart_mapping(box(*self.geometry.bounds)), rounded=False) return format_geojson(smart_mapping(box(*self.geometry.bounds)), rounded=False)

View file

@ -133,6 +133,8 @@ class Space(LevelGeometryMixin, SpecificLocation, models.Model):
@property @property
def grid_square(self): def grid_square(self):
if "geometry" in self.get_deferred_fields():
return None
return grid.get_squares_for_bounds(self.geometry.bounds) or '' return grid.get_squares_for_bounds(self.geometry.bounds) or ''
def details_display(self, editor_url=True, **kwargs): def details_display(self, editor_url=True, **kwargs):

View file

@ -137,6 +137,8 @@ class Area(SpaceGeometryMixin, SpecificLocation, models.Model):
@property @property
def grid_square(self): def grid_square(self):
if "geometry" in self.get_deferred_fields():
return None
return grid.get_squares_for_bounds(self.geometry.bounds) or '' return grid.get_squares_for_bounds(self.geometry.bounds) or ''
def details_display(self, editor_url=True, **kwargs): def details_display(self, editor_url=True, **kwargs):
@ -265,6 +267,8 @@ class POI(SpaceGeometryMixin, SpecificLocation, models.Model):
@property @property
def grid_square(self): def grid_square(self):
if "geometry" in self.get_deferred_fields():
return None
return grid.get_square_for_point(self.x, self.y) or '' return grid.get_square_for_point(self.x, self.y) or ''
@property @property

View file

@ -13,8 +13,8 @@ from c3nav.mapdata.models import (Area, Building, Door, Hole, Level, LocationGro
from c3nav.mapdata.models.access import AccessPermission, AccessRestriction, AccessRestrictionGroup from c3nav.mapdata.models.access import AccessPermission, AccessRestriction, AccessRestrictionGroup
from c3nav.mapdata.models.geometry.space import (POI, Column, CrossDescription, LeaveDescription, LineObstacle, from c3nav.mapdata.models.geometry.space import (POI, Column, CrossDescription, LeaveDescription, LineObstacle,
Obstacle, Ramp) Obstacle, Ramp)
from c3nav.mapdata.schemas.filters import (ByCategoryFilter, ByGroupFilter, ByLevelFilter, ByOnTopOfFilter, from c3nav.mapdata.schemas.filters import (ByCategoryFilter, ByGroupFilter, ByOnTopOfFilter, FilterSchema,
BySpaceFilter, FilterSchema) LevelGeometryFilter, SpaceGeometryFilter)
from c3nav.mapdata.schemas.models import (AccessRestrictionGroupSchema, AccessRestrictionSchema, AreaSchema, from c3nav.mapdata.schemas.models import (AccessRestrictionGroupSchema, AccessRestrictionSchema, AreaSchema,
BuildingSchema, ColumnSchema, CrossDescriptionSchema, DoorSchema, HoleSchema, BuildingSchema, ColumnSchema, CrossDescriptionSchema, DoorSchema, HoleSchema,
LeaveDescriptionSchema, LevelSchema, LineObstacleSchema, LeaveDescriptionSchema, LevelSchema, LineObstacleSchema,
@ -107,7 +107,7 @@ Buildings
response={200: list[BuildingSchema], **validate_responses, **auth_responses}, response={200: list[BuildingSchema], **validate_responses, **auth_responses},
summary="Get building list") summary="Get building list")
@paginate @paginate
def building_list(request, filters: Query[ByLevelFilter]): def building_list(request, filters: Query[LevelGeometryFilter]):
# todo cache? # todo cache?
return mapdata_list_endpoint(request, model=Building, filters=filters) return mapdata_list_endpoint(request, model=Building, filters=filters)
@ -125,7 +125,7 @@ Spaces
""" """
class SpaceFilters(ByGroupFilter, ByLevelFilter): class SpaceFilters(ByGroupFilter, LevelGeometryFilter):
pass pass
@ -155,7 +155,7 @@ Doors
response={200: list[DoorSchema], **validate_responses, **auth_responses}, response={200: list[DoorSchema], **validate_responses, **auth_responses},
summary="Get door list") summary="Get door list")
@paginate @paginate
def door_list(request, filters: Query[ByLevelFilter]): def door_list(request, filters: Query[LevelGeometryFilter]):
# todo cache? # todo cache?
return mapdata_list_endpoint(request, model=Door, filters=filters) return mapdata_list_endpoint(request, model=Door, filters=filters)
@ -177,7 +177,7 @@ Holes
response={200: list[HoleSchema], **validate_responses, **auth_responses}, response={200: list[HoleSchema], **validate_responses, **auth_responses},
summary="Get hole list") summary="Get hole list")
@paginate @paginate
def hole_list(request, filters: Query[BySpaceFilter]): def hole_list(request, filters: Query[SpaceGeometryFilter]):
# todo cache? # todo cache?
return mapdata_list_endpoint(request, model=Hole, filters=filters) return mapdata_list_endpoint(request, model=Hole, filters=filters)
@ -195,7 +195,7 @@ Areas
""" """
class AreaFilters(ByGroupFilter, BySpaceFilter): class AreaFilters(ByGroupFilter, SpaceGeometryFilter):
pass pass
@ -225,7 +225,7 @@ Stairs
response={200: list[StairSchema], **validate_responses, **auth_responses}, response={200: list[StairSchema], **validate_responses, **auth_responses},
summary="Get stair list") summary="Get stair list")
@paginate @paginate
def stair_list(request, filters: Query[BySpaceFilter]): def stair_list(request, filters: Query[SpaceGeometryFilter]):
# todo cache? # todo cache?
return mapdata_list_endpoint(request, model=Stair, filters=filters) return mapdata_list_endpoint(request, model=Stair, filters=filters)
@ -247,7 +247,7 @@ Ramps
response={200: list[RampSchema], **validate_responses, **auth_responses}, response={200: list[RampSchema], **validate_responses, **auth_responses},
summary="Get ramp list") summary="Get ramp list")
@paginate @paginate
def ramp_list(request, filters: Query[BySpaceFilter]): def ramp_list(request, filters: Query[SpaceGeometryFilter]):
# todo cache? # todo cache?
return mapdata_list_endpoint(request, model=Ramp, filters=filters) return mapdata_list_endpoint(request, model=Ramp, filters=filters)
@ -269,7 +269,7 @@ Obstacles
response={200: list[ObstacleSchema], **validate_responses, **auth_responses}, response={200: list[ObstacleSchema], **validate_responses, **auth_responses},
summary="Get obstacle list") summary="Get obstacle list")
@paginate @paginate
def obstacle_list(request, filters: Query[BySpaceFilter]): def obstacle_list(request, filters: Query[SpaceGeometryFilter]):
# todo cache? # todo cache?
return mapdata_list_endpoint(request, model=Obstacle, filters=filters) return mapdata_list_endpoint(request, model=Obstacle, filters=filters)
@ -291,7 +291,7 @@ LineObstacles
response={200: list[LineObstacleSchema], **validate_responses, **auth_responses}, response={200: list[LineObstacleSchema], **validate_responses, **auth_responses},
summary="Get line obstacle list") summary="Get line obstacle list")
@paginate @paginate
def lineobstacle_list(request, filters: Query[BySpaceFilter]): def lineobstacle_list(request, filters: Query[SpaceGeometryFilter]):
# todo cache? # todo cache?
return mapdata_list_endpoint(request, model=LineObstacle, filters=filters) return mapdata_list_endpoint(request, model=LineObstacle, filters=filters)
@ -313,7 +313,7 @@ Columns
response={200: list[ColumnSchema], **validate_responses, **auth_responses}, response={200: list[ColumnSchema], **validate_responses, **auth_responses},
summary="Get column list") summary="Get column list")
@paginate @paginate
def column_list(request, filters: Query[BySpaceFilter]): def column_list(request, filters: Query[SpaceGeometryFilter]):
# todo cache? # todo cache?
return mapdata_list_endpoint(request, model=Column, filters=filters) return mapdata_list_endpoint(request, model=Column, filters=filters)
@ -335,7 +335,7 @@ POIs
response={200: list[POISchema], **validate_responses, **auth_responses}, response={200: list[POISchema], **validate_responses, **auth_responses},
summary="Get POI list") summary="Get POI list")
@paginate @paginate
def poi_list(request, filters: Query[BySpaceFilter]): def poi_list(request, filters: Query[SpaceGeometryFilter]):
# todo cache? # todo cache?
return mapdata_list_endpoint(request, model=POI, filters=filters) return mapdata_list_endpoint(request, model=POI, filters=filters)
@ -357,7 +357,7 @@ LeaveDescriptions
response={200: list[LeaveDescriptionSchema], **validate_responses, **auth_responses}, response={200: list[LeaveDescriptionSchema], **validate_responses, **auth_responses},
summary="Get leave description list") summary="Get leave description list")
@paginate @paginate
def leavedescription_list(request, filters: Query[BySpaceFilter]): def leavedescription_list(request, filters: Query[SpaceGeometryFilter]):
# todo cache? # todo cache?
return mapdata_list_endpoint(request, model=LeaveDescription, filters=filters) return mapdata_list_endpoint(request, model=LeaveDescription, filters=filters)
@ -379,7 +379,7 @@ CrossDescriptions
response={200: list[CrossDescriptionSchema], **validate_responses, **auth_responses}, response={200: list[CrossDescriptionSchema], **validate_responses, **auth_responses},
summary="Get cross description list") summary="Get cross description list")
@paginate @paginate
def crossdescription_list(request, filters: Query[BySpaceFilter]): def crossdescription_list(request, filters: Query[SpaceGeometryFilter]):
# todo cache? # todo cache?
return mapdata_list_endpoint(request, model=CrossDescription, filters=filters) return mapdata_list_endpoint(request, model=CrossDescription, filters=filters)

View file

@ -160,3 +160,11 @@ class RemoveGeometryFilter(FilterSchema):
if not self.geometry: if not self.geometry:
qs = qs.defer('geometry') qs = qs.defer('geometry')
return super().filter_qs(qs) return super().filter_qs(qs)
class LevelGeometryFilter(ByLevelFilter, RemoveGeometryFilter):
pass
class SpaceGeometryFilter(BySpaceFilter, RemoveGeometryFilter):
pass

View file

@ -1,4 +1,4 @@
from typing import Any, ClassVar, Optional, Annotated from typing import Annotated, Any, ClassVar, Optional
from ninja import Schema from ninja import Schema
from pydantic import Field as APIField from pydantic import Field as APIField