rename newapi to api

This commit is contained in:
Laura Klünder 2023-12-03 21:55:08 +01:00
parent caf23d053c
commit ba4c2b7d0a
18 changed files with 101 additions and 115 deletions

View file

@ -2,7 +2,7 @@ from django.conf import settings
from ninja import Router as APIRouter
from ninja import Schema
from c3nav.api.newauth import APIAuthMethod, auth_responses
from c3nav.api.auth import APIAuthMethod, auth_responses
from c3nav.api.utils import NonEmptyStr
from c3nav.control.models import UserPermissions

View file

@ -25,7 +25,7 @@ class APIAuthMethod(StrEnum):
@dataclass
class NewAPIAuth:
class APIAuthDetails:
method: APIAuthMethod
readonly: bool
@ -52,13 +52,13 @@ class APITokenAuth(HttpBearer):
engine = import_module(settings.SESSION_ENGINE)
self.SessionStore = engine.SessionStore
def _authenticate(self, request, token) -> NewAPIAuth:
def _authenticate(self, request, token) -> APIAuthDetails:
request.user = AnonymousUser()
request.user_permissions = SimpleLazyObject(lambda: UserPermissionsMiddleware.get_user_permissions(request))
request.user_space_accesses = lazy(UserPermissionsMiddleware.get_user_space_accesses, dict)(request)
if token == "anonymous":
return NewAPIAuth(
return APIAuthDetails(
method=APIAuthMethod.ANONYMOUS,
readonly=True,
)
@ -69,7 +69,7 @@ class APITokenAuth(HttpBearer):
if not user.is_authenticated:
raise APITokenInvalid
request.user = user
return NewAPIAuth(
return APIAuthDetails(
method=APIAuthMethod.SESSION,
readonly=False,
)
@ -91,7 +91,7 @@ class APITokenAuth(HttpBearer):
request.user = secret.user
request.user_permissions = user_permissions
return NewAPIAuth(
return APIAuthDetails(
method=APIAuthMethod.SESSION,
readonly=secret.readonly
)

View file

@ -3,8 +3,8 @@ from ninja.openapi.docs import DocsBase
from ninja.operation import Operation
from ninja.schema import NinjaGenerateJsonSchema
from c3nav.api.auth import APITokenAuth
from c3nav.api.exceptions import CustomAPIException
from c3nav.api.newauth import APITokenAuth
class c3navAPI(NinjaAPI):

View file

@ -1,15 +1,15 @@
from django.urls import path
from django.views.generic.base import RedirectView
from c3nav.api.newapi import auth_api_router
from c3nav.api.api import auth_api_router
from c3nav.api.ninja import ninja_api
from c3nav.editor.newapi.endpoints import editor_api_router
from c3nav.mapdata.newapi.map import map_api_router
from c3nav.mapdata.newapi.mapdata import mapdata_api_router
from c3nav.mapdata.newapi.updates import updates_api_router
from c3nav.mesh.newapi import mesh_api_router
from c3nav.routing.newapi.positioning import positioning_api_router
from c3nav.routing.newapi.routing import routing_api_router
from c3nav.editor.api.endpoints import editor_api_router
from c3nav.mapdata.api.map import map_api_router
from c3nav.mapdata.api.mapdata import mapdata_api_router
from c3nav.mapdata.api.updates import updates_api_router
from c3nav.mesh.api import mesh_api_router
from c3nav.routing.api.positioning import positioning_api_router
from c3nav.routing.api.routing import routing_api_router
"""
new API (v2)

View file

@ -1,14 +1,14 @@
from functools import wraps
from c3nav.editor.models import ChangeSet
from c3nav.mapdata.api.base import api_etag
from c3nav.mapdata.models.access import AccessPermission
from c3nav.mapdata.newapi.base import newapi_etag
def newapi_etag_with_update_cache_key(permissions=True, etag_func=AccessPermission.etag_func, base_mapdata=False):
def api_etag_with_update_cache_key(permissions=True, etag_func=AccessPermission.etag_func, base_mapdata=False):
def inner_wrapper(func):
func = newapi_etag(permissions=permissions, etag_func=etag_func, base_mapdata=base_mapdata)(func)
func = api_etag(permissions=permissions, etag_func=etag_func, base_mapdata=base_mapdata)(func)
@wraps(func)
def inner_wrapped_func(request, *args, **kwargs):
try:

View file

@ -2,14 +2,14 @@ from django.urls import Resolver404, resolve
from django.utils.translation import gettext_lazy as _
from ninja import Router as APIRouter
from c3nav.api.auth import APITokenAuth, auth_permission_responses
from c3nav.api.exceptions import API404
from c3nav.api.newauth import APITokenAuth, auth_permission_responses
from c3nav.editor.newapi.base import newapi_etag_with_update_cache_key
from c3nav.editor.newapi.geometries import get_level_geometries_result, get_space_geometries_result
from c3nav.editor.newapi.schemas import EditorGeometriesElemSchema, EditorID, GeometryStylesSchema, UpdateCacheKey
from c3nav.editor.api.base import api_etag_with_update_cache_key
from c3nav.editor.api.geometries import get_level_geometries_result, get_space_geometries_result
from c3nav.editor.api.schemas import EditorGeometriesElemSchema, EditorID, GeometryStylesSchema, UpdateCacheKey
from c3nav.editor.views.base import editor_etag_func
from c3nav.mapdata.api.base import api_etag
from c3nav.mapdata.models import Source
from c3nav.mapdata.newapi.base import newapi_etag
from c3nav.mapdata.schemas.responses import BoundsSchema
editor_api_router = APIRouter(tags=["editor"], auth=APITokenAuth(permissions={"editor_access"}))
@ -19,7 +19,7 @@ editor_api_router = APIRouter(tags=["editor"], auth=APITokenAuth(permissions={"e
description="get maximum boundaries of everything on the map",
response={200: BoundsSchema, **auth_permission_responses},
openapi_extra={"security": [{"APITokenAuth": ["editor_access"]}]})
@newapi_etag()
@api_etag()
def bounds(request):
return {
"bounds": Source.max_bounds(),
@ -30,7 +30,7 @@ def bounds(request):
description="get the default colors for each geometry type",
response={200: GeometryStylesSchema, **auth_permission_responses},
openapi_extra={"security": [{"APITokenAuth": ["editor_access"]}]})
@newapi_etag(permissions=False)
@api_etag(permissions=False)
def geometrystyles(request):
return {
'building': '#aaaaaa',
@ -58,7 +58,7 @@ def geometrystyles(request):
response={200: list[EditorGeometriesElemSchema], **API404.dict(),
**auth_permission_responses},
openapi_extra={"security": [{"APITokenAuth": ["editor_access"]}]})
@newapi_etag_with_update_cache_key(etag_func=editor_etag_func)
@api_etag_with_update_cache_key(etag_func=editor_etag_func)
def space_geometries(request, space_id: EditorID, update_cache_key: UpdateCacheKey = None, **kwargs):
# newapi_etag_with_update_cache_key does the following, don't let it confuse you:
# - update_cache_key becomes the actual update_cache_key, not the one supplied be the user
@ -78,7 +78,7 @@ def space_geometries(request, space_id: EditorID, update_cache_key: UpdateCacheK
response={200: list[EditorGeometriesElemSchema], **API404.dict(),
**auth_permission_responses},
openapi_extra={"security": [{"APITokenAuth": ["editor_access"]}]})
@newapi_etag_with_update_cache_key(etag_func=editor_etag_func)
@api_etag_with_update_cache_key(etag_func=editor_etag_func)
def level_geometries(request, level_id: EditorID, update_cache_key: UpdateCacheKey = None, **kwargs):
# newapi_etag_with_update_cache_key does the following, don't let it confuse you:
# - update_cache_key becomes the actual update_cache_key, not the one supplied be the user
@ -117,7 +117,7 @@ def resolve_editor_path_api(request, path):
@editor_api_router.get('/as_api/{path:path}', summary="raw editor access",
response={200: dict, **API404.dict(), **auth_permission_responses},
openapi_extra={"security": [{"APITokenAuth": ["editor_access"]}]})
@newapi_etag() # todo: correct?
@api_etag() # todo: correct?
def view_as_api(request, path: str):
"""
get editor views rendered as JSON instead of HTML.
@ -139,7 +139,7 @@ def view_as_api(request, path: str):
@editor_api_router.post('/as_api/{path:path}', summary="raw editor access",
response={200: dict, **API404.dict(), **auth_permission_responses},
openapi_extra={"security": [{"APITokenAuth": ["editor_access", "write"]}]})
@newapi_etag() # todo: correct?
@api_etag() # todo: correct?
def view_as_api(request, path: str):
"""
get editor views rendered as JSON instead of HTML.

View file

@ -18,7 +18,7 @@ from c3nav.mapdata.utils.cache.stats import increment_cache_key
request_cache = LocalCacheProxy(maxsize=64)
def newapi_etag(permissions=True, etag_func=AccessPermission.etag_func, base_mapdata=False):
def api_etag(permissions=True, etag_func=AccessPermission.etag_func, base_mapdata=False):
def outer_wrapper(func):
@wraps(func)
@ -79,7 +79,7 @@ def newapi_etag(permissions=True, etag_func=AccessPermission.etag_func, base_map
return inner_wrapper
def newapi_stats(stat_name):
def api_stats(stat_name):
def wrapper(func):
@wraps(func)
def wrapped_func(request, *args, **kwargs):
@ -108,17 +108,3 @@ def api_stats_clean_location_value(value):
value = 'c:%s:%d:%d' % (value[1], int(float(value[2]) / 3) * 3, int(float(value[3]) / 3) * 3)
return (value, 'c:anywhere')
return (value, )
def api_stats(view_name):
def wrapper(func):
@wraps(func)
def wrapped_func(self, request, *args, **kwargs):
response = func(self, request, *args, **kwargs)
if response.status_code < 400 and kwargs:
name, value = next(iter(kwargs.items()))
for value in api_stats_clean_location_value(value):
increment_cache_key('apistats__%s__%s__%s' % (view_name, name, value))
return response
return wrapped_func
return wrapper

View file

@ -9,12 +9,12 @@ from ninja import Router as APIRouter
from ninja import Schema
from pydantic import Field as APIField
from c3nav.api.auth import auth_permission_responses, auth_responses, validate_responses
from c3nav.api.exceptions import API404, APIPermissionDenied, APIRequestValidationFailed
from c3nav.api.newauth import auth_permission_responses, auth_responses, validate_responses
from c3nav.api.utils import NonEmptyStr
from c3nav.mapdata.api.base import api_etag, api_stats
from c3nav.mapdata.models import Source
from c3nav.mapdata.models.locations import DynamicLocation, LocationRedirect, Position
from c3nav.mapdata.newapi.base import newapi_etag, newapi_stats
from c3nav.mapdata.schemas.filters import BySearchableFilter, RemoveGeometryFilter
from c3nav.mapdata.schemas.model_base import AnyLocationID, AnyPositionID, CustomLocationID
from c3nav.mapdata.schemas.models import (AnyPositionStatusSchema, FullListableLocationSchema, FullLocationSchema,
@ -30,7 +30,7 @@ map_api_router = APIRouter(tags=["map"])
@map_api_router.get('/bounds/', summary="get boundaries",
description="get maximum boundaries of everything on the map",
response={200: BoundsSchema, **auth_responses})
@newapi_etag(permissions=False)
@api_etag(permissions=False)
def bounds(request):
return {
"bounds": Source.max_bounds(),
@ -70,7 +70,7 @@ def _location_list(request, detailed: bool, filters: LocationListFilters):
@map_api_router.get('/locations/', summary="list locations (slim)",
description="Get locations (with most important attributes set)",
response={200: list[SlimListableLocationSchema], **validate_responses, **auth_responses})
@newapi_etag(base_mapdata=True)
@api_etag(base_mapdata=True)
def location_list(request, filters: Query[LocationListFilters]):
return _location_list(request, detailed=False, filters=filters)
@ -78,7 +78,7 @@ def location_list(request, filters: Query[LocationListFilters]):
@map_api_router.get('/locations/full/', summary="list locations (full)",
description="Get locations (with all attributes set)",
response={200: list[FullListableLocationSchema], **validate_responses, **auth_responses})
@newapi_etag(base_mapdata=True)
@api_etag(base_mapdata=True)
def location_list_full(request, filters: Query[LocationListFilters]):
return _location_list(request, detailed=True, filters=filters)
@ -151,8 +151,8 @@ class ShowRedirects(Schema):
@map_api_router.get('/locations/{location_id}/', summary="location by ID (slim)",
description="Get locations by ID (with all attributes set)",
response={200: SlimLocationSchema, **API404.dict(), **validate_responses, **auth_responses})
@newapi_stats('location_get')
@newapi_etag(base_mapdata=True)
@api_stats('location_get')
@api_etag(base_mapdata=True)
def location_by_id(request, location_id: AnyLocationID, filters: Query[RemoveGeometryFilter],
redirects: Query[ShowRedirects]):
return _location_retrieve(
@ -165,8 +165,8 @@ def location_by_id(request, location_id: AnyLocationID, filters: Query[RemoveGeo
@map_api_router.get('/locations/{location_id}/full/', summary="location by ID (full)",
description="Get location by ID (with all attributes set)",
response={200: FullLocationSchema, **API404.dict(), **validate_responses, **auth_responses})
@newapi_stats('location_get')
@newapi_etag(base_mapdata=True)
@api_stats('location_get')
@api_etag(base_mapdata=True)
def location_by_id_full(request, location_id: AnyLocationID, filters: Query[RemoveGeometryFilter],
redirects: Query[ShowRedirects]):
return _location_retrieve(
@ -179,8 +179,8 @@ def location_by_id_full(request, location_id: AnyLocationID, filters: Query[Remo
@map_api_router.get('/locations/{location_id}/display/', summary="location display by ID",
description="Get location display information by ID",
response={200: LocationDisplay, **API404.dict(), **auth_responses})
@newapi_stats('location_display')
@newapi_etag(base_mapdata=True)
@api_stats('location_display')
@api_etag(base_mapdata=True)
def location_by_id_display(request, location_id: AnyLocationID):
return _location_display(
request,
@ -191,8 +191,8 @@ def location_by_id_display(request, location_id: AnyLocationID):
@map_api_router.get('/locations/{location_id}/geometry/', summary="location geometry by id",
description="Get location geometry (if available) by ID",
response={200: LocationGeometry, **API404.dict(), **auth_responses})
@newapi_stats('location_geometery')
@newapi_etag(base_mapdata=True)
@api_stats('location_geometery')
@api_etag(base_mapdata=True)
def location_by_id_geometry(request, location_id: AnyLocationID):
return _location_geometry(
request,
@ -203,8 +203,8 @@ def location_by_id_geometry(request, location_id: AnyLocationID):
@map_api_router.get('/locations/by-slug/{location_slug}/', summary="location by slug (slim)",
description="Get location by slug (with most important attributes set)",
response={200: SlimLocationSchema, **API404.dict(), **validate_responses, **auth_responses})
@newapi_stats('location_get')
@newapi_etag(base_mapdata=True)
@api_stats('location_get')
@api_etag(base_mapdata=True)
def location_by_slug(request, location_slug: NonEmptyStr, filters: Query[RemoveGeometryFilter],
redirects: Query[ShowRedirects]):
return _location_retrieve(
@ -217,8 +217,8 @@ def location_by_slug(request, location_slug: NonEmptyStr, filters: Query[RemoveG
@map_api_router.get('/locations/by-slug/{location_slug}/full/', summary="location by slug (full)",
description="Get location by slug (with all attributes set)",
response={200: FullLocationSchema, **API404.dict(), **validate_responses, **auth_responses})
@newapi_stats('location_get')
@newapi_etag(base_mapdata=True)
@api_stats('location_get')
@api_etag(base_mapdata=True)
def location_by_slug_full(request, location_slug: NonEmptyStr, filters: Query[RemoveGeometryFilter],
redirects: Query[ShowRedirects]):
return _location_retrieve(
@ -231,8 +231,8 @@ def location_by_slug_full(request, location_slug: NonEmptyStr, filters: Query[Re
@map_api_router.get('/locations/by-slug/{location_slug}/display/', summary="location display by slug",
description="Get location display information by slug",
response={200: LocationDisplay, **API404.dict(), **auth_responses})
@newapi_stats('location_display')
@newapi_etag(base_mapdata=True)
@api_stats('location_display')
@api_etag(base_mapdata=True)
def location_by_slug_display(request, location_slug: NonEmptyStr):
return _location_display(
request,
@ -243,8 +243,8 @@ def location_by_slug_display(request, location_slug: NonEmptyStr):
@map_api_router.get('/locations/by-slug/{location_slug}/geometry/', summary="location geometry by slug",
description="Get location geometry (if available) by slug",
response={200: LocationGeometry, **API404.dict(), **auth_responses})
@newapi_stats('location_geometry')
@newapi_etag(base_mapdata=True)
@api_stats('location_geometry')
@api_etag(base_mapdata=True)
def location_by_slug_geometry(request, location_slug: NonEmptyStr):
return _location_geometry(
request,
@ -255,7 +255,7 @@ def location_by_slug_geometry(request, location_slug: NonEmptyStr):
@map_api_router.get('/positions/{position_id}/', summary="moving position coordinates",
description="get current coordinates of a moving position / dynamic location",
response={200: AnyPositionStatusSchema, **API404.dict(), **auth_responses})
@newapi_stats('get_position')
@api_stats('get_position')
def get_position_by_id(request, position_id: AnyPositionID):
# no caching for obvious reasons!
location = None

View file

@ -4,15 +4,15 @@ from django.db.models import Model
from ninja import Query
from ninja import Router as APIRouter
from c3nav.api.auth import auth_responses, validate_responses
from c3nav.api.exceptions import API404
from c3nav.api.newauth import auth_responses, validate_responses
from c3nav.mapdata.api.base import api_etag, optimize_query
from c3nav.mapdata.models import (Area, Building, Door, Hole, Level, LocationGroup, LocationGroupCategory, Source,
Space, Stair)
from c3nav.mapdata.models.access import AccessRestriction, AccessRestrictionGroup
from c3nav.mapdata.models.geometry.space import (POI, Column, CrossDescription, LeaveDescription, LineObstacle,
Obstacle, Ramp)
from c3nav.mapdata.models.locations import DynamicLocation
from c3nav.mapdata.newapi.base import newapi_etag, optimize_query
from c3nav.mapdata.schemas.filters import (ByCategoryFilter, ByGroupFilter, ByOnTopOfFilter, FilterSchema,
LevelGeometryFilter, SpaceGeometryFilter)
from c3nav.mapdata.schemas.models import (AccessRestrictionGroupSchema, AccessRestrictionSchema, AreaSchema,
@ -74,7 +74,7 @@ class LevelFilters(ByGroupFilter, ByOnTopOfFilter):
@mapdata_api_router.get('/levels/', summary="level list",
tags=["mapdata-root"], description=schema_description(LevelSchema),
response={200: list[LevelSchema], **validate_responses, **auth_responses})
@newapi_etag()
@api_etag()
def level_list(request, filters: Query[LevelFilters]):
return mapdata_list_endpoint(request, model=Level, filters=filters)
@ -82,7 +82,7 @@ def level_list(request, filters: Query[LevelFilters]):
@mapdata_api_router.get('/levels/{level_id}/', summary="level by ID",
tags=["mapdata-root"], description=schema_description(LevelSchema),
response={200: LevelSchema, **API404.dict(), **auth_responses})
@newapi_etag()
@api_etag()
def level_by_id(request, level_id: int):
return mapdata_retrieve_endpoint(request, Level, pk=level_id)
@ -95,7 +95,7 @@ Buildings
@mapdata_api_router.get('/buildings/', summary="building list",
tags=["mapdata-level"], description=schema_description(BuildingSchema),
response={200: list[BuildingSchema], **validate_responses, **auth_responses})
@newapi_etag(base_mapdata=True)
@api_etag(base_mapdata=True)
def building_list(request, filters: Query[LevelGeometryFilter]):
return mapdata_list_endpoint(request, model=Building, filters=filters)
@ -103,7 +103,7 @@ def building_list(request, filters: Query[LevelGeometryFilter]):
@mapdata_api_router.get('/buildings/{building_id}/', summary="building by ID",
tags=["mapdata-level"], description=schema_description(BuildingSchema),
response={200: BuildingSchema, **API404.dict(), **auth_responses})
@newapi_etag(base_mapdata=True)
@api_etag(base_mapdata=True)
def building_by_id(request, building_id: int):
return mapdata_retrieve_endpoint(request, Building, pk=building_id)
@ -120,7 +120,7 @@ class SpaceFilters(ByGroupFilter, LevelGeometryFilter):
@mapdata_api_router.get('/spaces/', summary="space list",
tags=["mapdata-level"], description=schema_description(SpaceSchema),
response={200: list[SpaceSchema], **validate_responses, **auth_responses})
@newapi_etag(base_mapdata=True)
@api_etag(base_mapdata=True)
def space_list(request, filters: Query[SpaceFilters]):
return mapdata_list_endpoint(request, model=Space, filters=filters)
@ -128,7 +128,7 @@ def space_list(request, filters: Query[SpaceFilters]):
@mapdata_api_router.get('/space/{space_id}/', summary="space by ID",
tags=["mapdata-level"], description=schema_description(SpaceSchema),
response={200: SpaceSchema, **API404.dict(), **auth_responses})
@newapi_etag(base_mapdata=True)
@api_etag(base_mapdata=True)
def space_by_id(request, space_id: int):
return mapdata_retrieve_endpoint(request, Space, pk=space_id)
@ -141,7 +141,7 @@ Doors
@mapdata_api_router.get('/doors/', summary="door list",
tags=["mapdata-level"], description=schema_description(DoorSchema),
response={200: list[DoorSchema], **validate_responses, **auth_responses})
@newapi_etag(base_mapdata=True)
@api_etag(base_mapdata=True)
def door_list(request, filters: Query[LevelGeometryFilter]):
return mapdata_list_endpoint(request, model=Door, filters=filters)
@ -149,7 +149,7 @@ def door_list(request, filters: Query[LevelGeometryFilter]):
@mapdata_api_router.get('/doors/{door_id}/', summary="door by ID",
tags=["mapdata-level"], description=schema_description(DoorSchema),
response={200: DoorSchema, **API404.dict(), **auth_responses})
@newapi_etag(base_mapdata=True)
@api_etag(base_mapdata=True)
def door_by_id(request, door_id: int):
return mapdata_retrieve_endpoint(request, Door, pk=door_id)
@ -162,7 +162,7 @@ Holes
@mapdata_api_router.get('/holes/', summary="hole list",
tags=["mapdata-space"], description=schema_description(HoleSchema),
response={200: list[HoleSchema], **validate_responses, **auth_responses})
@newapi_etag()
@api_etag()
def hole_list(request, filters: Query[SpaceGeometryFilter]):
return mapdata_list_endpoint(request, model=Hole, filters=filters)
@ -170,7 +170,7 @@ def hole_list(request, filters: Query[SpaceGeometryFilter]):
@mapdata_api_router.get('/holes/{hole_id}/', summary="hole by ID",
tags=["mapdata-space"], description=schema_description(HoleSchema),
response={200: HoleSchema, **API404.dict(), **auth_responses})
@newapi_etag()
@api_etag()
def hole_by_id(request, hole_id: int):
return mapdata_retrieve_endpoint(request, Hole, pk=hole_id)
@ -187,7 +187,7 @@ class AreaFilters(ByGroupFilter, SpaceGeometryFilter):
@mapdata_api_router.get('/areas/', summary="area list",
tags=["mapdata-space"], description=schema_description(AreaSchema),
response={200: list[AreaSchema], **validate_responses, **auth_responses})
@newapi_etag()
@api_etag()
def area_list(request, filters: Query[AreaFilters]):
return mapdata_list_endpoint(request, model=Area, filters=filters)
@ -195,7 +195,7 @@ def area_list(request, filters: Query[AreaFilters]):
@mapdata_api_router.get('/areas/{area_id}/', summary="area by ID",
tags=["mapdata-space"], description=schema_description(AreaSchema),
response={200: AreaSchema, **API404.dict(), **auth_responses})
@newapi_etag()
@api_etag()
def area_by_id(request, area_id: int):
return mapdata_retrieve_endpoint(request, Area, pk=area_id)
@ -208,7 +208,7 @@ Stairs
@mapdata_api_router.get('/stairs/', summary="stair list",
tags=["mapdata-space"], description=schema_description(StairSchema),
response={200: list[StairSchema], **validate_responses, **auth_responses})
@newapi_etag()
@api_etag()
def stair_list(request, filters: Query[SpaceGeometryFilter]):
return mapdata_list_endpoint(request, model=Stair, filters=filters)
@ -216,7 +216,7 @@ def stair_list(request, filters: Query[SpaceGeometryFilter]):
@mapdata_api_router.get('/stairs/{stair_id}/', summary="stair by ID",
tags=["mapdata-space"], description=schema_description(StairSchema),
response={200: StairSchema, **API404.dict(), **auth_responses})
@newapi_etag()
@api_etag()
def stair_by_id(request, stair_id: int):
return mapdata_retrieve_endpoint(request, Stair, pk=stair_id)
@ -229,7 +229,7 @@ Ramps
@mapdata_api_router.get('/ramps/', summary="ramp list",
tags=["mapdata-space"], description=schema_description(RampSchema),
response={200: list[RampSchema], **validate_responses, **auth_responses})
@newapi_etag()
@api_etag()
def ramp_list(request, filters: Query[SpaceGeometryFilter]):
return mapdata_list_endpoint(request, model=Ramp, filters=filters)
@ -237,7 +237,7 @@ def ramp_list(request, filters: Query[SpaceGeometryFilter]):
@mapdata_api_router.get('/ramps/{ramp_id}/', summary="ramp by ID",
tags=["mapdata-space"], description=schema_description(RampSchema),
response={200: RampSchema, **API404.dict(), **auth_responses})
@newapi_etag()
@api_etag()
def ramp_by_id(request, ramp_id: int):
return mapdata_retrieve_endpoint(request, Ramp, pk=ramp_id)
@ -250,7 +250,7 @@ Obstacles
@mapdata_api_router.get('/obstacles/', summary="obstacle list",
tags=["mapdata-space"], description=schema_description(ObstacleSchema),
response={200: list[ObstacleSchema], **validate_responses, **auth_responses})
@newapi_etag()
@api_etag()
def obstacle_list(request, filters: Query[SpaceGeometryFilter]):
return mapdata_list_endpoint(request, model=Obstacle, filters=filters)
@ -258,7 +258,7 @@ def obstacle_list(request, filters: Query[SpaceGeometryFilter]):
@mapdata_api_router.get('/obstacles/{obstacle_id}/', summary="obstacle by ID",
tags=["mapdata-space"], description=schema_description(ObstacleSchema),
response={200: ObstacleSchema, **API404.dict(), **auth_responses})
@newapi_etag()
@api_etag()
def obstacle_by_id(request, obstacle_id: int):
return mapdata_retrieve_endpoint(request, Obstacle, pk=obstacle_id)
@ -271,7 +271,7 @@ LineObstacles
@mapdata_api_router.get('/lineobstacles/', summary="line obstacle list",
tags=["mapdata-space"], description=schema_description(LineObstacleSchema),
response={200: list[LineObstacleSchema], **validate_responses, **auth_responses})
@newapi_etag()
@api_etag()
def lineobstacle_list(request, filters: Query[SpaceGeometryFilter]):
return mapdata_list_endpoint(request, model=LineObstacle, filters=filters)
@ -279,7 +279,7 @@ def lineobstacle_list(request, filters: Query[SpaceGeometryFilter]):
@mapdata_api_router.get('/lineobstacles/{lineobstacle_id}/', summary="line obstacle by ID",
tags=["mapdata-space"], description=schema_description(LineObstacleSchema),
response={200: LineObstacleSchema, **API404.dict(), **auth_responses},)
@newapi_etag()
@api_etag()
def lineobstacle_by_id(request, lineobstacle_id: int):
return mapdata_retrieve_endpoint(request, LineObstacle, pk=lineobstacle_id)
@ -292,7 +292,7 @@ Columns
@mapdata_api_router.get('/columns/', summary="column list",
tags=["mapdata-space"], description=schema_description(ColumnSchema),
response={200: list[ColumnSchema], **validate_responses, **auth_responses})
@newapi_etag()
@api_etag()
def column_list(request, filters: Query[SpaceGeometryFilter]):
return mapdata_list_endpoint(request, model=Column, filters=filters)
@ -300,7 +300,7 @@ def column_list(request, filters: Query[SpaceGeometryFilter]):
@mapdata_api_router.get('/columns/{column_id}/', summary="column by ID",
tags=["mapdata-space"], description=schema_description(ColumnSchema),
response={200: ColumnSchema, **API404.dict(), **auth_responses})
@newapi_etag()
@api_etag()
def column_by_id(request, column_id: int):
return mapdata_retrieve_endpoint(request, Column, pk=column_id)
@ -313,7 +313,7 @@ POIs
@mapdata_api_router.get('/pois/', summary="POI list",
tags=["mapdata-space"], description=schema_description(POISchema),
response={200: list[POISchema], **validate_responses, **auth_responses})
@newapi_etag()
@api_etag()
def poi_list(request, filters: Query[SpaceGeometryFilter]):
return mapdata_list_endpoint(request, model=POI, filters=filters)
@ -321,7 +321,7 @@ def poi_list(request, filters: Query[SpaceGeometryFilter]):
@mapdata_api_router.get('/pois/{poi_id}/', summary="POI by ID",
tags=["mapdata-space"], description=schema_description(POISchema),
response={200: POISchema, **API404.dict(), **auth_responses})
@newapi_etag()
@api_etag()
def poi_by_id(request, poi_id: int):
return mapdata_retrieve_endpoint(request, POI, pk=poi_id)
@ -334,7 +334,7 @@ LeaveDescriptions
@mapdata_api_router.get('/leavedescriptions/', summary="leave description list",
tags=["mapdata-space"], description=schema_description(LeaveDescriptionSchema),
response={200: list[LeaveDescriptionSchema], **validate_responses, **auth_responses})
@newapi_etag()
@api_etag()
def leavedescription_list(request, filters: Query[SpaceGeometryFilter]):
return mapdata_list_endpoint(request, model=LeaveDescription, filters=filters)
@ -342,7 +342,7 @@ def leavedescription_list(request, filters: Query[SpaceGeometryFilter]):
@mapdata_api_router.get('/leavedescriptions/{leavedescription_id}/', summary="leave description by ID",
tags=["mapdata-space"], description=schema_description(LeaveDescriptionSchema),
response={200: LeaveDescriptionSchema, **API404.dict(), **auth_responses})
@newapi_etag()
@api_etag()
def leavedescription_by_id(request, leavedescription_id: int):
return mapdata_retrieve_endpoint(request, LeaveDescription, pk=leavedescription_id)
@ -355,7 +355,7 @@ CrossDescriptions
@mapdata_api_router.get('/crossdescriptions/', summary="cross description list",
tags=["mapdata-space"], description=schema_description(CrossDescriptionSchema),
response={200: list[CrossDescriptionSchema], **validate_responses, **auth_responses})
@newapi_etag()
@api_etag()
def crossdescription_list(request, filters: Query[SpaceGeometryFilter]):
return mapdata_list_endpoint(request, model=CrossDescription, filters=filters)
@ -363,7 +363,7 @@ def crossdescription_list(request, filters: Query[SpaceGeometryFilter]):
@mapdata_api_router.get('/crossdescriptions/{crossdescription_id}/', summary="cross description by ID",
tags=["mapdata-space"], description=schema_description(CrossDescriptionSchema),
response={200: CrossDescriptionSchema, **API404.dict(), **auth_responses})
@newapi_etag()
@api_etag()
def crossdescription_by_id(request, crossdescription_id: int):
return mapdata_retrieve_endpoint(request, CrossDescription, pk=crossdescription_id)
@ -376,7 +376,7 @@ LocationGroup
@mapdata_api_router.get('/locationgroups/', summary="location group list",
tags=["mapdata-root"], description=schema_description(LocationGroupSchema),
response={200: list[LocationGroupSchema], **validate_responses, **auth_responses})
@newapi_etag()
@api_etag()
def locationgroup_list(request, filters: Query[ByCategoryFilter]):
return mapdata_list_endpoint(request, model=LocationGroup, filters=filters)
@ -384,7 +384,7 @@ def locationgroup_list(request, filters: Query[ByCategoryFilter]):
@mapdata_api_router.get('/locationgroups/{locationgroup_id}/', summary="location group by ID",
tags=["mapdata-root"], description=schema_description(LocationGroupSchema),
response={200: LocationGroupSchema, **API404.dict(), **auth_responses})
@newapi_etag()
@api_etag()
def locationgroup_by_id(request, locationgroup_id: int):
return mapdata_retrieve_endpoint(request, LocationGroup, pk=locationgroup_id)
@ -397,7 +397,7 @@ LocationGroupCategories
@mapdata_api_router.get('/locationgroupcategories/', summary="location group category list",
tags=["mapdata-root"], description=schema_description(LocationGroupCategorySchema),
response={200: list[LocationGroupCategorySchema], **auth_responses})
@newapi_etag()
@api_etag()
def locationgroupcategory_list(request):
return mapdata_list_endpoint(request, model=LocationGroupCategory)
@ -405,7 +405,7 @@ def locationgroupcategory_list(request):
@mapdata_api_router.get('/locationgroupcategories/{category_id}/', summary="location group category by ID",
tags=["mapdata-root"], description=schema_description(LocationGroupCategorySchema),
response={200: LocationGroupCategorySchema, **API404.dict(), **auth_responses})
@newapi_etag()
@api_etag()
def locationgroupcategory_by_id(request, category_id: int):
return mapdata_retrieve_endpoint(request, LocationGroupCategory, pk=category_id)
@ -418,7 +418,7 @@ Sources
@mapdata_api_router.get('/sources/', summary="source list",
tags=["mapdata-root"], description=schema_description(SourceSchema),
response={200: list[SourceSchema], **auth_responses})
@newapi_etag()
@api_etag()
def source_list(request):
return mapdata_list_endpoint(request, model=Source)
@ -426,7 +426,7 @@ def source_list(request):
@mapdata_api_router.get('/sources/{source_id}/', summary="source by ID",
tags=["mapdata-root"], description=schema_description(SourceSchema),
response={200: SourceSchema, **API404.dict(), **auth_responses})
@newapi_etag()
@api_etag()
def source_by_id(request, source_id: int):
return mapdata_retrieve_endpoint(request, Source, pk=source_id)
@ -439,7 +439,7 @@ AccessRestrictions
@mapdata_api_router.get('/accessrestrictions/', summary="access restriction list",
tags=["mapdata-root"], description=schema_description(AccessRestrictionSchema),
response={200: list[AccessRestrictionSchema], **auth_responses})
@newapi_etag()
@api_etag()
def accessrestriction_list(request):
return mapdata_list_endpoint(request, model=AccessRestriction)
@ -447,7 +447,7 @@ def accessrestriction_list(request):
@mapdata_api_router.get('/accessrestrictions/{accessrestriction_id}/', summary="access restriction by ID",
tags=["mapdata-root"], description=schema_description(AccessRestrictionSchema),
response={200: AccessRestrictionSchema, **API404.dict(), **auth_responses})
@newapi_etag()
@api_etag()
def accessrestriction_by_id(request, accessrestriction_id: int):
return mapdata_retrieve_endpoint(request, AccessRestriction, pk=accessrestriction_id)
@ -460,7 +460,7 @@ AccessRestrictionGroups
@mapdata_api_router.get('/accessrestrictiongroups/', summary="access restriction group list",
tags=["mapdata-root"], description=schema_description(AccessRestrictionGroupSchema),
response={200: list[AccessRestrictionGroupSchema], **auth_responses})
@newapi_etag()
@api_etag()
def accessrestrictiongroup_list(request):
return mapdata_list_endpoint(request, model=AccessRestrictionGroup)
@ -468,7 +468,7 @@ def accessrestrictiongroup_list(request):
@mapdata_api_router.get('/accessrestrictiongroups/{group_id}/', summary="access restriction group by ID",
tags=["mapdata-root"], description=schema_description(AccessRestrictionGroupSchema),
response={200: AccessRestrictionGroupSchema, **API404.dict(), **auth_responses})
@newapi_etag()
@api_etag()
def accessrestrictiongroups_by_id(request, group_id: int):
return mapdata_retrieve_endpoint(request, AccessRestrictionGroup, pk=group_id)
@ -481,7 +481,7 @@ DynamicLocations
@mapdata_api_router.get('/dynamiclocations/', summary="dynamic location list",
tags=["mapdata-root"], description=schema_description(DynamicLocationSchema),
response={200: list[DynamicLocationSchema], **auth_responses})
@newapi_etag()
@api_etag()
def dynamiclocation_list(request):
return mapdata_list_endpoint(request, model=DynamicLocation)
@ -489,6 +489,6 @@ def dynamiclocation_list(request):
@mapdata_api_router.get('/dynamiclocations/{dynamiclocation_id}/', summary="dynamic location by ID",
tags=["mapdata-root"], description=schema_description(DynamicLocationSchema),
response={200: DynamicLocationSchema, **API404.dict(), **auth_responses})
@newapi_etag()
@api_etag()
def dynamiclocation_by_id(request, dynamiclocation_id: int):
return mapdata_retrieve_endpoint(request, DynamicLocation, pk=dynamiclocation_id)

View file

@ -6,10 +6,10 @@ from ninja import Router as APIRouter
from ninja import Schema
from pydantic import PositiveInt
from c3nav.api.newauth import auth_responses
from c3nav.api.auth import auth_responses
from c3nav.api.utils import NonEmptyStr
from c3nav.mapdata.api.base import api_etag
from c3nav.mapdata.models import MapUpdate
from c3nav.mapdata.newapi.base import newapi_etag
from c3nav.mapdata.schemas.responses import BoundsSchema
from c3nav.mapdata.utils.cache.stats import increment_cache_key
from c3nav.mapdata.utils.user import get_user_data

View file

@ -9,8 +9,8 @@ from ninja import Schema, UploadedFile
from ninja.pagination import paginate
from pydantic import PositiveInt, field_validator
from c3nav.api.auth import APITokenAuth, auth_permission_responses, auth_responses, validate_responses
from c3nav.api.exceptions import API404, APIConflict, APIRequestValidationFailed
from c3nav.api.newauth import APITokenAuth, auth_permission_responses, auth_responses, validate_responses
from c3nav.mesh.dataformats import BoardType, ChipType, FirmwareImage
from c3nav.mesh.messages import MeshMessageType
from c3nav.mesh.models import FirmwareBuild, FirmwareVersion, NodeMessage

View file

@ -6,7 +6,7 @@ from ninja import Router as APIRouter
from ninja import Schema
from pydantic import NegativeInt, PositiveInt
from c3nav.api.newauth import auth_responses
from c3nav.api.auth import auth_responses
from c3nav.api.utils import NonEmptyStr
from c3nav.mapdata.models.access import AccessPermission
from c3nav.mapdata.schemas.models import CustomLocationSchema

View file

@ -9,12 +9,12 @@ from ninja import Router as APIRouter
from ninja import Schema
from pydantic import PositiveInt
from c3nav.api.auth import APITokenAuth, auth_responses, validate_responses
from c3nav.api.exceptions import APIRequestValidationFailed
from c3nav.api.newauth import APITokenAuth, auth_responses, validate_responses
from c3nav.api.utils import NonEmptyStr
from c3nav.mapdata.api.base import api_stats_clean_location_value
from c3nav.mapdata.models.access import AccessPermission
from c3nav.mapdata.models.locations import Position
from c3nav.mapdata.newapi.base import api_stats_clean_location_value
from c3nav.mapdata.schemas.model_base import AnyLocationID, Coordinates3D
from c3nav.mapdata.utils.cache.stats import increment_cache_key
from c3nav.mapdata.utils.locations import visible_locations_for_request