add more mapdata endpoints, completing the mapdata API tag

This commit is contained in:
Laura Klünder 2023-11-19 16:48:40 +01:00
parent 846101ea37
commit 141ab7489e
3 changed files with 76 additions and 16 deletions

View file

@ -9,13 +9,14 @@ from c3nav.api.exceptions import API404
from c3nav.mapdata.api import optimize_query
from c3nav.mapdata.models import (Area, Building, Door, Hole, Level, LocationGroup, LocationGroupCategory, Source,
Space, Stair)
from c3nav.mapdata.models.access import AccessPermission
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.models import (AreaSchema, BuildingSchema, ColumnSchema, CrossDescriptionSchema, DoorSchema,
HoleSchema, LeaveDescriptionSchema, LevelSchema, LineObstacleSchema,
from c3nav.mapdata.schemas.models import (AccessRestrictionGroupSchema, AccessRestrictionSchema, AreaSchema,
BuildingSchema, ColumnSchema, CrossDescriptionSchema, DoorSchema, HoleSchema,
LeaveDescriptionSchema, LevelSchema, LineObstacleSchema,
LocationGroupCategorySchema, LocationGroupSchema, ObstacleSchema, POISchema,
RampSchema, SourceSchema, SpaceSchema, StairSchema)
@ -420,3 +421,43 @@ def source_list(request):
def source_detail(request, source_id: int):
# todo: access, caching, filtering, etc
return mapdata_retrieve_endpoint(request, Source, pk=source_id)
"""
AccessRestrictions
"""
@mapdata_api_router.get('/accessrestrictions/', response=list[AccessRestrictionSchema],
summary="Get access restriction list")
@paginate
def accessrestriction_list(request):
# todo cache?
return mapdata_list_endpoint(request, model=AccessRestriction)
@mapdata_api_router.get('/accessrestrictions/{accessrestriction_id}/', response=AccessRestrictionSchema,
summary="Get access restriction by ID")
def accessrestriction_detail(request, accessrestriction_id: int):
# todo: access, caching, filtering, etc
return mapdata_retrieve_endpoint(request, AccessRestriction, pk=accessrestriction_id)
"""
AccessRestrictionGroups
"""
@mapdata_api_router.get('/accessrestrictiongroups/', response=list[AccessRestrictionGroupSchema],
summary="Get access restriction group list")
@paginate
def accessrestrictiongroup_list(request):
# todo cache?
return mapdata_list_endpoint(request, model=AccessRestrictionGroup)
@mapdata_api_router.get('/accessrestrictiongroups/{group_id}/', response=AccessRestrictionGroupSchema,
summary="Get access restriction group by ID")
def accessrestrictiongroups_detail(request, group_id: int):
# todo: access, caching, filtering, etc
return mapdata_retrieve_endpoint(request, AccessRestrictionGroup, pk=group_id)

View file

@ -10,12 +10,6 @@ from c3nav.api.schema import LineStringSchema, PointSchema, PolygonSchema
from c3nav.api.utils import NonEmptyStr
class DjangoModelSchema(Schema):
id: PositiveInt = APIField(
title="ID",
)
class SerializableSchema(Schema):
@model_validator(mode="wrap") # noqa
@classmethod
@ -25,6 +19,12 @@ class SerializableSchema(Schema):
return handler(values)
class DjangoModelSchema(SerializableSchema):
id: PositiveInt = APIField(
title="ID",
)
class LocationSlugSchema(Schema):
slug: NonEmptyStr = APIField(
title="location slug",
@ -36,7 +36,7 @@ class LocationSlugSchema(Schema):
)
class AccessRestrictionSchema(Schema):
class WithAccessRestrictionSchema(Schema):
access_restriction: Optional[PositiveInt] = APIField(
default=None,
title="access restriction ID",
@ -58,7 +58,7 @@ class TitledSchema(Schema):
)
class LocationSchema(AccessRestrictionSchema, TitledSchema, LocationSlugSchema, SerializableSchema):
class LocationSchema(WithAccessRestrictionSchema, TitledSchema, LocationSlugSchema):
subtitle: NonEmptyStr = APIField(
title="subtitle (preferred language)",
description="an automatically generated short description for this location. "

View file

@ -4,8 +4,8 @@ from pydantic import Field as APIField
from pydantic import NonNegativeFloat, PositiveFloat, PositiveInt
from c3nav.api.utils import NonEmptyStr
from c3nav.mapdata.schemas.model_base import (AccessRestrictionSchema, DjangoModelSchema, LabelSettingsSchema,
LocationSchema, SerializableSchema, SpecificLocationSchema, TitledSchema,
from c3nav.mapdata.schemas.model_base import (DjangoModelSchema, LabelSettingsSchema, LocationSchema,
SpecificLocationSchema, TitledSchema, WithAccessRestrictionSchema,
WithLevelSchema, WithLineStringGeometrySchema, WithPointGeometrySchema,
WithPolygonGeometrySchema, WithSpaceSchema)
@ -58,7 +58,7 @@ class SpaceSchema(WithPolygonGeometrySchema, SpecificLocationSchema, WithLevelSc
)
class DoorSchema(WithPolygonGeometrySchema, AccessRestrictionSchema, WithLevelSchema, DjangoModelSchema):
class DoorSchema(WithPolygonGeometrySchema, WithAccessRestrictionSchema, WithLevelSchema, DjangoModelSchema):
"""
A link between two spaces
"""
@ -221,7 +221,7 @@ class LocationGroupSchema(LocationSchema, DjangoModelSchema):
)
class LocationGroupCategorySchema(TitledSchema, SerializableSchema, DjangoModelSchema):
class LocationGroupCategorySchema(TitledSchema, DjangoModelSchema):
"""
A location group category can hold either one or multiple location groups.
@ -277,7 +277,7 @@ class LocationGroupCategorySchema(TitledSchema, SerializableSchema, DjangoModelS
priority: int = APIField() # todo: ???
class SourceSchema(AccessRestrictionSchema, DjangoModelSchema):
class SourceSchema(WithAccessRestrictionSchema, DjangoModelSchema):
"""
A source image that can be traced in the editor.
"""
@ -289,3 +289,22 @@ class SourceSchema(AccessRestrictionSchema, DjangoModelSchema):
left: float
top: float
right: float
class AccessRestrictionSchema(TitledSchema, DjangoModelSchema):
"""
A category that some objects can belong to.
If they do, you can only see them if you have a permission to see objects with this access retriction.
"""
open: bool
groups: list[PositiveInt] = APIField(
title="access restriction groups"
)
class AccessRestrictionGroupSchema(WithAccessRestrictionSchema, DjangoModelSchema):
"""
For simplicity's sake, access restrictions can belong to groups, and you can grant permissions for the entire group.
"""
pass