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
|
@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)
|
||||||
|
|
|
@ -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):
|
||||||
|
|
|
@ -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
|
||||||
|
|
|
@ -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)
|
||||||
|
|
||||||
|
|
|
@ -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
|
||||||
|
|
|
@ -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
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue