rename newapi to api
This commit is contained in:
parent
caf23d053c
commit
ba4c2b7d0a
18 changed files with 101 additions and 115 deletions
|
@ -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
|
||||
|
|
@ -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
|
||||
)
|
|
@ -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):
|
||||
|
|
|
@ -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)
|
||||
|
|
|
@ -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:
|
|
@ -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.
|
|
@ -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
|
|
@ -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
|
|
@ -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)
|
|
@ -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
|
|
@ -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
|
|
@ -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
|
|
@ -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
|
Loading…
Add table
Add a link
Reference in a new issue