remove geometry from serialized data using filter parameter
This commit is contained in:
parent
3fd5c49926
commit
fc53e3197d
6 changed files with 35 additions and 17 deletions
|
@ -78,13 +78,15 @@ class GeometryMixin(SerializableMixin):
|
|||
|
||||
@cached_property
|
||||
def point(self):
|
||||
if "geometry" in self.get_deferred_fields():
|
||||
raise ValueError
|
||||
return good_representative_point(self.geometry)
|
||||
|
||||
def _serialize(self, geometry=True, simple_geometry=False, **kwargs):
|
||||
result = super()._serialize(simple_geometry=simple_geometry, **kwargs)
|
||||
if geometry and "geometry" not in self.get_deferred_fields():
|
||||
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])
|
||||
if not isinstance(self.geometry, Point):
|
||||
self.geometry: BaseGeometry
|
||||
|
@ -99,6 +101,8 @@ class GeometryMixin(SerializableMixin):
|
|||
return result
|
||||
|
||||
def get_geometry(self, detailed_geometry=True):
|
||||
if "geometry" in self.get_deferred_fields():
|
||||
return None
|
||||
if detailed_geometry:
|
||||
return format_geojson(smart_mapping(self.geometry), rounded=False)
|
||||
return format_geojson(smart_mapping(box(*self.geometry.bounds)), rounded=False)
|
||||
|
|
|
@ -133,6 +133,8 @@ class Space(LevelGeometryMixin, SpecificLocation, models.Model):
|
|||
|
||||
@property
|
||||
def grid_square(self):
|
||||
if "geometry" in self.get_deferred_fields():
|
||||
return None
|
||||
return grid.get_squares_for_bounds(self.geometry.bounds) or ''
|
||||
|
||||
def details_display(self, editor_url=True, **kwargs):
|
||||
|
|
|
@ -137,6 +137,8 @@ class Area(SpaceGeometryMixin, SpecificLocation, models.Model):
|
|||
|
||||
@property
|
||||
def grid_square(self):
|
||||
if "geometry" in self.get_deferred_fields():
|
||||
return None
|
||||
return grid.get_squares_for_bounds(self.geometry.bounds) or ''
|
||||
|
||||
def details_display(self, editor_url=True, **kwargs):
|
||||
|
@ -265,6 +267,8 @@ class POI(SpaceGeometryMixin, SpecificLocation, models.Model):
|
|||
|
||||
@property
|
||||
def grid_square(self):
|
||||
if "geometry" in self.get_deferred_fields():
|
||||
return None
|
||||
return grid.get_square_for_point(self.x, self.y) or ''
|
||||
|
||||
@property
|
||||
|
|
|
@ -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.geometry.space import (POI, Column, CrossDescription, LeaveDescription, LineObstacle,
|
||||
Obstacle, Ramp)
|
||||
from c3nav.mapdata.schemas.filters import (ByCategoryFilter, ByGroupFilter, ByLevelFilter, ByOnTopOfFilter,
|
||||
BySpaceFilter, FilterSchema)
|
||||
from c3nav.mapdata.schemas.filters import (ByCategoryFilter, ByGroupFilter, ByOnTopOfFilter, FilterSchema,
|
||||
LevelGeometryFilter, SpaceGeometryFilter)
|
||||
from c3nav.mapdata.schemas.models import (AccessRestrictionGroupSchema, AccessRestrictionSchema, AreaSchema,
|
||||
BuildingSchema, ColumnSchema, CrossDescriptionSchema, DoorSchema, HoleSchema,
|
||||
LeaveDescriptionSchema, LevelSchema, LineObstacleSchema,
|
||||
|
@ -107,7 +107,7 @@ Buildings
|
|||
response={200: list[BuildingSchema], **validate_responses, **auth_responses},
|
||||
summary="Get building list")
|
||||
@paginate
|
||||
def building_list(request, filters: Query[ByLevelFilter]):
|
||||
def building_list(request, filters: Query[LevelGeometryFilter]):
|
||||
# todo cache?
|
||||
return mapdata_list_endpoint(request, model=Building, filters=filters)
|
||||
|
||||
|
@ -125,7 +125,7 @@ Spaces
|
|||
"""
|
||||
|
||||
|
||||
class SpaceFilters(ByGroupFilter, ByLevelFilter):
|
||||
class SpaceFilters(ByGroupFilter, LevelGeometryFilter):
|
||||
pass
|
||||
|
||||
|
||||
|
@ -155,7 +155,7 @@ Doors
|
|||
response={200: list[DoorSchema], **validate_responses, **auth_responses},
|
||||
summary="Get door list")
|
||||
@paginate
|
||||
def door_list(request, filters: Query[ByLevelFilter]):
|
||||
def door_list(request, filters: Query[LevelGeometryFilter]):
|
||||
# todo cache?
|
||||
return mapdata_list_endpoint(request, model=Door, filters=filters)
|
||||
|
||||
|
@ -177,7 +177,7 @@ Holes
|
|||
response={200: list[HoleSchema], **validate_responses, **auth_responses},
|
||||
summary="Get hole list")
|
||||
@paginate
|
||||
def hole_list(request, filters: Query[BySpaceFilter]):
|
||||
def hole_list(request, filters: Query[SpaceGeometryFilter]):
|
||||
# todo cache?
|
||||
return mapdata_list_endpoint(request, model=Hole, filters=filters)
|
||||
|
||||
|
@ -195,7 +195,7 @@ Areas
|
|||
"""
|
||||
|
||||
|
||||
class AreaFilters(ByGroupFilter, BySpaceFilter):
|
||||
class AreaFilters(ByGroupFilter, SpaceGeometryFilter):
|
||||
pass
|
||||
|
||||
|
||||
|
@ -225,7 +225,7 @@ Stairs
|
|||
response={200: list[StairSchema], **validate_responses, **auth_responses},
|
||||
summary="Get stair list")
|
||||
@paginate
|
||||
def stair_list(request, filters: Query[BySpaceFilter]):
|
||||
def stair_list(request, filters: Query[SpaceGeometryFilter]):
|
||||
# todo cache?
|
||||
return mapdata_list_endpoint(request, model=Stair, filters=filters)
|
||||
|
||||
|
@ -247,7 +247,7 @@ Ramps
|
|||
response={200: list[RampSchema], **validate_responses, **auth_responses},
|
||||
summary="Get ramp list")
|
||||
@paginate
|
||||
def ramp_list(request, filters: Query[BySpaceFilter]):
|
||||
def ramp_list(request, filters: Query[SpaceGeometryFilter]):
|
||||
# todo cache?
|
||||
return mapdata_list_endpoint(request, model=Ramp, filters=filters)
|
||||
|
||||
|
@ -269,7 +269,7 @@ Obstacles
|
|||
response={200: list[ObstacleSchema], **validate_responses, **auth_responses},
|
||||
summary="Get obstacle list")
|
||||
@paginate
|
||||
def obstacle_list(request, filters: Query[BySpaceFilter]):
|
||||
def obstacle_list(request, filters: Query[SpaceGeometryFilter]):
|
||||
# todo cache?
|
||||
return mapdata_list_endpoint(request, model=Obstacle, filters=filters)
|
||||
|
||||
|
@ -291,7 +291,7 @@ LineObstacles
|
|||
response={200: list[LineObstacleSchema], **validate_responses, **auth_responses},
|
||||
summary="Get line obstacle list")
|
||||
@paginate
|
||||
def lineobstacle_list(request, filters: Query[BySpaceFilter]):
|
||||
def lineobstacle_list(request, filters: Query[SpaceGeometryFilter]):
|
||||
# todo cache?
|
||||
return mapdata_list_endpoint(request, model=LineObstacle, filters=filters)
|
||||
|
||||
|
@ -313,7 +313,7 @@ Columns
|
|||
response={200: list[ColumnSchema], **validate_responses, **auth_responses},
|
||||
summary="Get column list")
|
||||
@paginate
|
||||
def column_list(request, filters: Query[BySpaceFilter]):
|
||||
def column_list(request, filters: Query[SpaceGeometryFilter]):
|
||||
# todo cache?
|
||||
return mapdata_list_endpoint(request, model=Column, filters=filters)
|
||||
|
||||
|
@ -335,7 +335,7 @@ POIs
|
|||
response={200: list[POISchema], **validate_responses, **auth_responses},
|
||||
summary="Get POI list")
|
||||
@paginate
|
||||
def poi_list(request, filters: Query[BySpaceFilter]):
|
||||
def poi_list(request, filters: Query[SpaceGeometryFilter]):
|
||||
# todo cache?
|
||||
return mapdata_list_endpoint(request, model=POI, filters=filters)
|
||||
|
||||
|
@ -357,7 +357,7 @@ LeaveDescriptions
|
|||
response={200: list[LeaveDescriptionSchema], **validate_responses, **auth_responses},
|
||||
summary="Get leave description list")
|
||||
@paginate
|
||||
def leavedescription_list(request, filters: Query[BySpaceFilter]):
|
||||
def leavedescription_list(request, filters: Query[SpaceGeometryFilter]):
|
||||
# todo cache?
|
||||
return mapdata_list_endpoint(request, model=LeaveDescription, filters=filters)
|
||||
|
||||
|
@ -379,7 +379,7 @@ CrossDescriptions
|
|||
response={200: list[CrossDescriptionSchema], **validate_responses, **auth_responses},
|
||||
summary="Get cross description list")
|
||||
@paginate
|
||||
def crossdescription_list(request, filters: Query[BySpaceFilter]):
|
||||
def crossdescription_list(request, filters: Query[SpaceGeometryFilter]):
|
||||
# todo cache?
|
||||
return mapdata_list_endpoint(request, model=CrossDescription, filters=filters)
|
||||
|
||||
|
|
|
@ -160,3 +160,11 @@ class RemoveGeometryFilter(FilterSchema):
|
|||
if not self.geometry:
|
||||
qs = qs.defer('geometry')
|
||||
return super().filter_qs(qs)
|
||||
|
||||
|
||||
class LevelGeometryFilter(ByLevelFilter, RemoveGeometryFilter):
|
||||
pass
|
||||
|
||||
|
||||
class SpaceGeometryFilter(BySpaceFilter, RemoveGeometryFilter):
|
||||
pass
|
||||
|
|
|
@ -1,4 +1,4 @@
|
|||
from typing import Any, ClassVar, Optional, Annotated
|
||||
from typing import Annotated, Any, ClassVar, Optional
|
||||
|
||||
from ninja import Schema
|
||||
from pydantic import Field as APIField
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue