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 Router as APIRouter
from ninja import Schema 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.api.utils import NonEmptyStr
from c3nav.control.models import UserPermissions from c3nav.control.models import UserPermissions

View file

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

View file

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

View file

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

View file

@ -1,14 +1,14 @@
from functools import wraps from functools import wraps
from c3nav.editor.models import ChangeSet from c3nav.editor.models import ChangeSet
from c3nav.mapdata.api.base import api_etag
from c3nav.mapdata.models.access import AccessPermission 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): 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) @wraps(func)
def inner_wrapped_func(request, *args, **kwargs): def inner_wrapped_func(request, *args, **kwargs):
try: try:

View file

@ -2,14 +2,14 @@ from django.urls import Resolver404, resolve
from django.utils.translation import gettext_lazy as _ from django.utils.translation import gettext_lazy as _
from ninja import Router as APIRouter from ninja import Router as APIRouter
from c3nav.api.auth import APITokenAuth, auth_permission_responses
from c3nav.api.exceptions import API404 from c3nav.api.exceptions import API404
from c3nav.api.newauth import APITokenAuth, auth_permission_responses from c3nav.editor.api.base import api_etag_with_update_cache_key
from c3nav.editor.newapi.base import newapi_etag_with_update_cache_key from c3nav.editor.api.geometries import get_level_geometries_result, get_space_geometries_result
from c3nav.editor.newapi.geometries import get_level_geometries_result, get_space_geometries_result from c3nav.editor.api.schemas import EditorGeometriesElemSchema, EditorID, GeometryStylesSchema, UpdateCacheKey
from c3nav.editor.newapi.schemas import EditorGeometriesElemSchema, EditorID, GeometryStylesSchema, UpdateCacheKey
from c3nav.editor.views.base import editor_etag_func 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.models import Source
from c3nav.mapdata.newapi.base import newapi_etag
from c3nav.mapdata.schemas.responses import BoundsSchema from c3nav.mapdata.schemas.responses import BoundsSchema
editor_api_router = APIRouter(tags=["editor"], auth=APITokenAuth(permissions={"editor_access"})) 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", description="get maximum boundaries of everything on the map",
response={200: BoundsSchema, **auth_permission_responses}, response={200: BoundsSchema, **auth_permission_responses},
openapi_extra={"security": [{"APITokenAuth": ["editor_access"]}]}) openapi_extra={"security": [{"APITokenAuth": ["editor_access"]}]})
@newapi_etag() @api_etag()
def bounds(request): def bounds(request):
return { return {
"bounds": Source.max_bounds(), "bounds": Source.max_bounds(),
@ -30,7 +30,7 @@ def bounds(request):
description="get the default colors for each geometry type", description="get the default colors for each geometry type",
response={200: GeometryStylesSchema, **auth_permission_responses}, response={200: GeometryStylesSchema, **auth_permission_responses},
openapi_extra={"security": [{"APITokenAuth": ["editor_access"]}]}) openapi_extra={"security": [{"APITokenAuth": ["editor_access"]}]})
@newapi_etag(permissions=False) @api_etag(permissions=False)
def geometrystyles(request): def geometrystyles(request):
return { return {
'building': '#aaaaaa', 'building': '#aaaaaa',
@ -58,7 +58,7 @@ def geometrystyles(request):
response={200: list[EditorGeometriesElemSchema], **API404.dict(), response={200: list[EditorGeometriesElemSchema], **API404.dict(),
**auth_permission_responses}, **auth_permission_responses},
openapi_extra={"security": [{"APITokenAuth": ["editor_access"]}]}) 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): 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: # 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 # - 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(), response={200: list[EditorGeometriesElemSchema], **API404.dict(),
**auth_permission_responses}, **auth_permission_responses},
openapi_extra={"security": [{"APITokenAuth": ["editor_access"]}]}) 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): 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: # 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 # - 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", @editor_api_router.get('/as_api/{path:path}', summary="raw editor access",
response={200: dict, **API404.dict(), **auth_permission_responses}, response={200: dict, **API404.dict(), **auth_permission_responses},
openapi_extra={"security": [{"APITokenAuth": ["editor_access"]}]}) openapi_extra={"security": [{"APITokenAuth": ["editor_access"]}]})
@newapi_etag() # todo: correct? @api_etag() # todo: correct?
def view_as_api(request, path: str): def view_as_api(request, path: str):
""" """
get editor views rendered as JSON instead of HTML. 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", @editor_api_router.post('/as_api/{path:path}', summary="raw editor access",
response={200: dict, **API404.dict(), **auth_permission_responses}, response={200: dict, **API404.dict(), **auth_permission_responses},
openapi_extra={"security": [{"APITokenAuth": ["editor_access", "write"]}]}) openapi_extra={"security": [{"APITokenAuth": ["editor_access", "write"]}]})
@newapi_etag() # todo: correct? @api_etag() # todo: correct?
def view_as_api(request, path: str): def view_as_api(request, path: str):
""" """
get editor views rendered as JSON instead of HTML. 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) 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): def outer_wrapper(func):
@wraps(func) @wraps(func)
@ -79,7 +79,7 @@ def newapi_etag(permissions=True, etag_func=AccessPermission.etag_func, base_map
return inner_wrapper return inner_wrapper
def newapi_stats(stat_name): def api_stats(stat_name):
def wrapper(func): def wrapper(func):
@wraps(func) @wraps(func)
def wrapped_func(request, *args, **kwargs): 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) 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, 'c:anywhere')
return (value, ) 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 ninja import Schema
from pydantic import Field as APIField 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.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.api.utils import NonEmptyStr
from c3nav.mapdata.api.base import api_etag, api_stats
from c3nav.mapdata.models import Source from c3nav.mapdata.models import Source
from c3nav.mapdata.models.locations import DynamicLocation, LocationRedirect, Position 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.filters import BySearchableFilter, RemoveGeometryFilter
from c3nav.mapdata.schemas.model_base import AnyLocationID, AnyPositionID, CustomLocationID from c3nav.mapdata.schemas.model_base import AnyLocationID, AnyPositionID, CustomLocationID
from c3nav.mapdata.schemas.models import (AnyPositionStatusSchema, FullListableLocationSchema, FullLocationSchema, 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", @map_api_router.get('/bounds/', summary="get boundaries",
description="get maximum boundaries of everything on the map", description="get maximum boundaries of everything on the map",
response={200: BoundsSchema, **auth_responses}) response={200: BoundsSchema, **auth_responses})
@newapi_etag(permissions=False) @api_etag(permissions=False)
def bounds(request): def bounds(request):
return { return {
"bounds": Source.max_bounds(), "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)", @map_api_router.get('/locations/', summary="list locations (slim)",
description="Get locations (with most important attributes set)", description="Get locations (with most important attributes set)",
response={200: list[SlimListableLocationSchema], **validate_responses, **auth_responses}) 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]): def location_list(request, filters: Query[LocationListFilters]):
return _location_list(request, detailed=False, filters=filters) 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)", @map_api_router.get('/locations/full/', summary="list locations (full)",
description="Get locations (with all attributes set)", description="Get locations (with all attributes set)",
response={200: list[FullListableLocationSchema], **validate_responses, **auth_responses}) 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]): def location_list_full(request, filters: Query[LocationListFilters]):
return _location_list(request, detailed=True, filters=filters) 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)", @map_api_router.get('/locations/{location_id}/', summary="location by ID (slim)",
description="Get locations by ID (with all attributes set)", description="Get locations by ID (with all attributes set)",
response={200: SlimLocationSchema, **API404.dict(), **validate_responses, **auth_responses}) response={200: SlimLocationSchema, **API404.dict(), **validate_responses, **auth_responses})
@newapi_stats('location_get') @api_stats('location_get')
@newapi_etag(base_mapdata=True) @api_etag(base_mapdata=True)
def location_by_id(request, location_id: AnyLocationID, filters: Query[RemoveGeometryFilter], def location_by_id(request, location_id: AnyLocationID, filters: Query[RemoveGeometryFilter],
redirects: Query[ShowRedirects]): redirects: Query[ShowRedirects]):
return _location_retrieve( 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)", @map_api_router.get('/locations/{location_id}/full/', summary="location by ID (full)",
description="Get location by ID (with all attributes set)", description="Get location by ID (with all attributes set)",
response={200: FullLocationSchema, **API404.dict(), **validate_responses, **auth_responses}) response={200: FullLocationSchema, **API404.dict(), **validate_responses, **auth_responses})
@newapi_stats('location_get') @api_stats('location_get')
@newapi_etag(base_mapdata=True) @api_etag(base_mapdata=True)
def location_by_id_full(request, location_id: AnyLocationID, filters: Query[RemoveGeometryFilter], def location_by_id_full(request, location_id: AnyLocationID, filters: Query[RemoveGeometryFilter],
redirects: Query[ShowRedirects]): redirects: Query[ShowRedirects]):
return _location_retrieve( 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", @map_api_router.get('/locations/{location_id}/display/', summary="location display by ID",
description="Get location display information by ID", description="Get location display information by ID",
response={200: LocationDisplay, **API404.dict(), **auth_responses}) response={200: LocationDisplay, **API404.dict(), **auth_responses})
@newapi_stats('location_display') @api_stats('location_display')
@newapi_etag(base_mapdata=True) @api_etag(base_mapdata=True)
def location_by_id_display(request, location_id: AnyLocationID): def location_by_id_display(request, location_id: AnyLocationID):
return _location_display( return _location_display(
request, 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", @map_api_router.get('/locations/{location_id}/geometry/', summary="location geometry by id",
description="Get location geometry (if available) by ID", description="Get location geometry (if available) by ID",
response={200: LocationGeometry, **API404.dict(), **auth_responses}) response={200: LocationGeometry, **API404.dict(), **auth_responses})
@newapi_stats('location_geometery') @api_stats('location_geometery')
@newapi_etag(base_mapdata=True) @api_etag(base_mapdata=True)
def location_by_id_geometry(request, location_id: AnyLocationID): def location_by_id_geometry(request, location_id: AnyLocationID):
return _location_geometry( return _location_geometry(
request, 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)", @map_api_router.get('/locations/by-slug/{location_slug}/', summary="location by slug (slim)",
description="Get location by slug (with most important attributes set)", description="Get location by slug (with most important attributes set)",
response={200: SlimLocationSchema, **API404.dict(), **validate_responses, **auth_responses}) response={200: SlimLocationSchema, **API404.dict(), **validate_responses, **auth_responses})
@newapi_stats('location_get') @api_stats('location_get')
@newapi_etag(base_mapdata=True) @api_etag(base_mapdata=True)
def location_by_slug(request, location_slug: NonEmptyStr, filters: Query[RemoveGeometryFilter], def location_by_slug(request, location_slug: NonEmptyStr, filters: Query[RemoveGeometryFilter],
redirects: Query[ShowRedirects]): redirects: Query[ShowRedirects]):
return _location_retrieve( 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)", @map_api_router.get('/locations/by-slug/{location_slug}/full/', summary="location by slug (full)",
description="Get location by slug (with all attributes set)", description="Get location by slug (with all attributes set)",
response={200: FullLocationSchema, **API404.dict(), **validate_responses, **auth_responses}) response={200: FullLocationSchema, **API404.dict(), **validate_responses, **auth_responses})
@newapi_stats('location_get') @api_stats('location_get')
@newapi_etag(base_mapdata=True) @api_etag(base_mapdata=True)
def location_by_slug_full(request, location_slug: NonEmptyStr, filters: Query[RemoveGeometryFilter], def location_by_slug_full(request, location_slug: NonEmptyStr, filters: Query[RemoveGeometryFilter],
redirects: Query[ShowRedirects]): redirects: Query[ShowRedirects]):
return _location_retrieve( 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", @map_api_router.get('/locations/by-slug/{location_slug}/display/', summary="location display by slug",
description="Get location display information by slug", description="Get location display information by slug",
response={200: LocationDisplay, **API404.dict(), **auth_responses}) response={200: LocationDisplay, **API404.dict(), **auth_responses})
@newapi_stats('location_display') @api_stats('location_display')
@newapi_etag(base_mapdata=True) @api_etag(base_mapdata=True)
def location_by_slug_display(request, location_slug: NonEmptyStr): def location_by_slug_display(request, location_slug: NonEmptyStr):
return _location_display( return _location_display(
request, 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", @map_api_router.get('/locations/by-slug/{location_slug}/geometry/', summary="location geometry by slug",
description="Get location geometry (if available) by slug", description="Get location geometry (if available) by slug",
response={200: LocationGeometry, **API404.dict(), **auth_responses}) response={200: LocationGeometry, **API404.dict(), **auth_responses})
@newapi_stats('location_geometry') @api_stats('location_geometry')
@newapi_etag(base_mapdata=True) @api_etag(base_mapdata=True)
def location_by_slug_geometry(request, location_slug: NonEmptyStr): def location_by_slug_geometry(request, location_slug: NonEmptyStr):
return _location_geometry( return _location_geometry(
request, 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", @map_api_router.get('/positions/{position_id}/', summary="moving position coordinates",
description="get current coordinates of a moving position / dynamic location", description="get current coordinates of a moving position / dynamic location",
response={200: AnyPositionStatusSchema, **API404.dict(), **auth_responses}) response={200: AnyPositionStatusSchema, **API404.dict(), **auth_responses})
@newapi_stats('get_position') @api_stats('get_position')
def get_position_by_id(request, position_id: AnyPositionID): def get_position_by_id(request, position_id: AnyPositionID):
# no caching for obvious reasons! # no caching for obvious reasons!
location = None location = None

View file

@ -4,15 +4,15 @@ from django.db.models import Model
from ninja import Query from ninja import Query
from ninja import Router as APIRouter from ninja import Router as APIRouter
from c3nav.api.auth import auth_responses, validate_responses
from c3nav.api.exceptions import API404 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, from c3nav.mapdata.models import (Area, Building, Door, Hole, Level, LocationGroup, LocationGroupCategory, Source,
Space, Stair) Space, Stair)
from c3nav.mapdata.models.access import AccessRestriction, AccessRestrictionGroup from c3nav.mapdata.models.access import 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.models.locations import DynamicLocation 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, from c3nav.mapdata.schemas.filters import (ByCategoryFilter, ByGroupFilter, ByOnTopOfFilter, FilterSchema,
LevelGeometryFilter, SpaceGeometryFilter) LevelGeometryFilter, SpaceGeometryFilter)
from c3nav.mapdata.schemas.models import (AccessRestrictionGroupSchema, AccessRestrictionSchema, AreaSchema, 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", @mapdata_api_router.get('/levels/', summary="level list",
tags=["mapdata-root"], description=schema_description(LevelSchema), tags=["mapdata-root"], description=schema_description(LevelSchema),
response={200: list[LevelSchema], **validate_responses, **auth_responses}) response={200: list[LevelSchema], **validate_responses, **auth_responses})
@newapi_etag() @api_etag()
def level_list(request, filters: Query[LevelFilters]): def level_list(request, filters: Query[LevelFilters]):
return mapdata_list_endpoint(request, model=Level, filters=filters) 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", @mapdata_api_router.get('/levels/{level_id}/', summary="level by ID",
tags=["mapdata-root"], description=schema_description(LevelSchema), tags=["mapdata-root"], description=schema_description(LevelSchema),
response={200: LevelSchema, **API404.dict(), **auth_responses}) response={200: LevelSchema, **API404.dict(), **auth_responses})
@newapi_etag() @api_etag()
def level_by_id(request, level_id: int): def level_by_id(request, level_id: int):
return mapdata_retrieve_endpoint(request, Level, pk=level_id) return mapdata_retrieve_endpoint(request, Level, pk=level_id)
@ -95,7 +95,7 @@ Buildings
@mapdata_api_router.get('/buildings/', summary="building list", @mapdata_api_router.get('/buildings/', summary="building list",
tags=["mapdata-level"], description=schema_description(BuildingSchema), tags=["mapdata-level"], description=schema_description(BuildingSchema),
response={200: list[BuildingSchema], **validate_responses, **auth_responses}) 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]): def building_list(request, filters: Query[LevelGeometryFilter]):
return mapdata_list_endpoint(request, model=Building, filters=filters) 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", @mapdata_api_router.get('/buildings/{building_id}/', summary="building by ID",
tags=["mapdata-level"], description=schema_description(BuildingSchema), tags=["mapdata-level"], description=schema_description(BuildingSchema),
response={200: BuildingSchema, **API404.dict(), **auth_responses}) 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): def building_by_id(request, building_id: int):
return mapdata_retrieve_endpoint(request, Building, pk=building_id) 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", @mapdata_api_router.get('/spaces/', summary="space list",
tags=["mapdata-level"], description=schema_description(SpaceSchema), tags=["mapdata-level"], description=schema_description(SpaceSchema),
response={200: list[SpaceSchema], **validate_responses, **auth_responses}) 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]): def space_list(request, filters: Query[SpaceFilters]):
return mapdata_list_endpoint(request, model=Space, filters=filters) 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", @mapdata_api_router.get('/space/{space_id}/', summary="space by ID",
tags=["mapdata-level"], description=schema_description(SpaceSchema), tags=["mapdata-level"], description=schema_description(SpaceSchema),
response={200: SpaceSchema, **API404.dict(), **auth_responses}) 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): def space_by_id(request, space_id: int):
return mapdata_retrieve_endpoint(request, Space, pk=space_id) return mapdata_retrieve_endpoint(request, Space, pk=space_id)
@ -141,7 +141,7 @@ Doors
@mapdata_api_router.get('/doors/', summary="door list", @mapdata_api_router.get('/doors/', summary="door list",
tags=["mapdata-level"], description=schema_description(DoorSchema), tags=["mapdata-level"], description=schema_description(DoorSchema),
response={200: list[DoorSchema], **validate_responses, **auth_responses}) 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]): def door_list(request, filters: Query[LevelGeometryFilter]):
return mapdata_list_endpoint(request, model=Door, filters=filters) 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", @mapdata_api_router.get('/doors/{door_id}/', summary="door by ID",
tags=["mapdata-level"], description=schema_description(DoorSchema), tags=["mapdata-level"], description=schema_description(DoorSchema),
response={200: DoorSchema, **API404.dict(), **auth_responses}) 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): def door_by_id(request, door_id: int):
return mapdata_retrieve_endpoint(request, Door, pk=door_id) return mapdata_retrieve_endpoint(request, Door, pk=door_id)
@ -162,7 +162,7 @@ Holes
@mapdata_api_router.get('/holes/', summary="hole list", @mapdata_api_router.get('/holes/', summary="hole list",
tags=["mapdata-space"], description=schema_description(HoleSchema), tags=["mapdata-space"], description=schema_description(HoleSchema),
response={200: list[HoleSchema], **validate_responses, **auth_responses}) response={200: list[HoleSchema], **validate_responses, **auth_responses})
@newapi_etag() @api_etag()
def hole_list(request, filters: Query[SpaceGeometryFilter]): def hole_list(request, filters: Query[SpaceGeometryFilter]):
return mapdata_list_endpoint(request, model=Hole, filters=filters) 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", @mapdata_api_router.get('/holes/{hole_id}/', summary="hole by ID",
tags=["mapdata-space"], description=schema_description(HoleSchema), tags=["mapdata-space"], description=schema_description(HoleSchema),
response={200: HoleSchema, **API404.dict(), **auth_responses}) response={200: HoleSchema, **API404.dict(), **auth_responses})
@newapi_etag() @api_etag()
def hole_by_id(request, hole_id: int): def hole_by_id(request, hole_id: int):
return mapdata_retrieve_endpoint(request, Hole, pk=hole_id) 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", @mapdata_api_router.get('/areas/', summary="area list",
tags=["mapdata-space"], description=schema_description(AreaSchema), tags=["mapdata-space"], description=schema_description(AreaSchema),
response={200: list[AreaSchema], **validate_responses, **auth_responses}) response={200: list[AreaSchema], **validate_responses, **auth_responses})
@newapi_etag() @api_etag()
def area_list(request, filters: Query[AreaFilters]): def area_list(request, filters: Query[AreaFilters]):
return mapdata_list_endpoint(request, model=Area, filters=filters) 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", @mapdata_api_router.get('/areas/{area_id}/', summary="area by ID",
tags=["mapdata-space"], description=schema_description(AreaSchema), tags=["mapdata-space"], description=schema_description(AreaSchema),
response={200: AreaSchema, **API404.dict(), **auth_responses}) response={200: AreaSchema, **API404.dict(), **auth_responses})
@newapi_etag() @api_etag()
def area_by_id(request, area_id: int): def area_by_id(request, area_id: int):
return mapdata_retrieve_endpoint(request, Area, pk=area_id) return mapdata_retrieve_endpoint(request, Area, pk=area_id)
@ -208,7 +208,7 @@ Stairs
@mapdata_api_router.get('/stairs/', summary="stair list", @mapdata_api_router.get('/stairs/', summary="stair list",
tags=["mapdata-space"], description=schema_description(StairSchema), tags=["mapdata-space"], description=schema_description(StairSchema),
response={200: list[StairSchema], **validate_responses, **auth_responses}) response={200: list[StairSchema], **validate_responses, **auth_responses})
@newapi_etag() @api_etag()
def stair_list(request, filters: Query[SpaceGeometryFilter]): def stair_list(request, filters: Query[SpaceGeometryFilter]):
return mapdata_list_endpoint(request, model=Stair, filters=filters) 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", @mapdata_api_router.get('/stairs/{stair_id}/', summary="stair by ID",
tags=["mapdata-space"], description=schema_description(StairSchema), tags=["mapdata-space"], description=schema_description(StairSchema),
response={200: StairSchema, **API404.dict(), **auth_responses}) response={200: StairSchema, **API404.dict(), **auth_responses})
@newapi_etag() @api_etag()
def stair_by_id(request, stair_id: int): def stair_by_id(request, stair_id: int):
return mapdata_retrieve_endpoint(request, Stair, pk=stair_id) return mapdata_retrieve_endpoint(request, Stair, pk=stair_id)
@ -229,7 +229,7 @@ Ramps
@mapdata_api_router.get('/ramps/', summary="ramp list", @mapdata_api_router.get('/ramps/', summary="ramp list",
tags=["mapdata-space"], description=schema_description(RampSchema), tags=["mapdata-space"], description=schema_description(RampSchema),
response={200: list[RampSchema], **validate_responses, **auth_responses}) response={200: list[RampSchema], **validate_responses, **auth_responses})
@newapi_etag() @api_etag()
def ramp_list(request, filters: Query[SpaceGeometryFilter]): def ramp_list(request, filters: Query[SpaceGeometryFilter]):
return mapdata_list_endpoint(request, model=Ramp, filters=filters) 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", @mapdata_api_router.get('/ramps/{ramp_id}/', summary="ramp by ID",
tags=["mapdata-space"], description=schema_description(RampSchema), tags=["mapdata-space"], description=schema_description(RampSchema),
response={200: RampSchema, **API404.dict(), **auth_responses}) response={200: RampSchema, **API404.dict(), **auth_responses})
@newapi_etag() @api_etag()
def ramp_by_id(request, ramp_id: int): def ramp_by_id(request, ramp_id: int):
return mapdata_retrieve_endpoint(request, Ramp, pk=ramp_id) return mapdata_retrieve_endpoint(request, Ramp, pk=ramp_id)
@ -250,7 +250,7 @@ Obstacles
@mapdata_api_router.get('/obstacles/', summary="obstacle list", @mapdata_api_router.get('/obstacles/', summary="obstacle list",
tags=["mapdata-space"], description=schema_description(ObstacleSchema), tags=["mapdata-space"], description=schema_description(ObstacleSchema),
response={200: list[ObstacleSchema], **validate_responses, **auth_responses}) response={200: list[ObstacleSchema], **validate_responses, **auth_responses})
@newapi_etag() @api_etag()
def obstacle_list(request, filters: Query[SpaceGeometryFilter]): def obstacle_list(request, filters: Query[SpaceGeometryFilter]):
return mapdata_list_endpoint(request, model=Obstacle, filters=filters) 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", @mapdata_api_router.get('/obstacles/{obstacle_id}/', summary="obstacle by ID",
tags=["mapdata-space"], description=schema_description(ObstacleSchema), tags=["mapdata-space"], description=schema_description(ObstacleSchema),
response={200: ObstacleSchema, **API404.dict(), **auth_responses}) response={200: ObstacleSchema, **API404.dict(), **auth_responses})
@newapi_etag() @api_etag()
def obstacle_by_id(request, obstacle_id: int): def obstacle_by_id(request, obstacle_id: int):
return mapdata_retrieve_endpoint(request, Obstacle, pk=obstacle_id) return mapdata_retrieve_endpoint(request, Obstacle, pk=obstacle_id)
@ -271,7 +271,7 @@ LineObstacles
@mapdata_api_router.get('/lineobstacles/', summary="line obstacle list", @mapdata_api_router.get('/lineobstacles/', summary="line obstacle list",
tags=["mapdata-space"], description=schema_description(LineObstacleSchema), tags=["mapdata-space"], description=schema_description(LineObstacleSchema),
response={200: list[LineObstacleSchema], **validate_responses, **auth_responses}) response={200: list[LineObstacleSchema], **validate_responses, **auth_responses})
@newapi_etag() @api_etag()
def lineobstacle_list(request, filters: Query[SpaceGeometryFilter]): def lineobstacle_list(request, filters: Query[SpaceGeometryFilter]):
return mapdata_list_endpoint(request, model=LineObstacle, filters=filters) 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", @mapdata_api_router.get('/lineobstacles/{lineobstacle_id}/', summary="line obstacle by ID",
tags=["mapdata-space"], description=schema_description(LineObstacleSchema), tags=["mapdata-space"], description=schema_description(LineObstacleSchema),
response={200: LineObstacleSchema, **API404.dict(), **auth_responses},) response={200: LineObstacleSchema, **API404.dict(), **auth_responses},)
@newapi_etag() @api_etag()
def lineobstacle_by_id(request, lineobstacle_id: int): def lineobstacle_by_id(request, lineobstacle_id: int):
return mapdata_retrieve_endpoint(request, LineObstacle, pk=lineobstacle_id) return mapdata_retrieve_endpoint(request, LineObstacle, pk=lineobstacle_id)
@ -292,7 +292,7 @@ Columns
@mapdata_api_router.get('/columns/', summary="column list", @mapdata_api_router.get('/columns/', summary="column list",
tags=["mapdata-space"], description=schema_description(ColumnSchema), tags=["mapdata-space"], description=schema_description(ColumnSchema),
response={200: list[ColumnSchema], **validate_responses, **auth_responses}) response={200: list[ColumnSchema], **validate_responses, **auth_responses})
@newapi_etag() @api_etag()
def column_list(request, filters: Query[SpaceGeometryFilter]): def column_list(request, filters: Query[SpaceGeometryFilter]):
return mapdata_list_endpoint(request, model=Column, filters=filters) 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", @mapdata_api_router.get('/columns/{column_id}/', summary="column by ID",
tags=["mapdata-space"], description=schema_description(ColumnSchema), tags=["mapdata-space"], description=schema_description(ColumnSchema),
response={200: ColumnSchema, **API404.dict(), **auth_responses}) response={200: ColumnSchema, **API404.dict(), **auth_responses})
@newapi_etag() @api_etag()
def column_by_id(request, column_id: int): def column_by_id(request, column_id: int):
return mapdata_retrieve_endpoint(request, Column, pk=column_id) return mapdata_retrieve_endpoint(request, Column, pk=column_id)
@ -313,7 +313,7 @@ POIs
@mapdata_api_router.get('/pois/', summary="POI list", @mapdata_api_router.get('/pois/', summary="POI list",
tags=["mapdata-space"], description=schema_description(POISchema), tags=["mapdata-space"], description=schema_description(POISchema),
response={200: list[POISchema], **validate_responses, **auth_responses}) response={200: list[POISchema], **validate_responses, **auth_responses})
@newapi_etag() @api_etag()
def poi_list(request, filters: Query[SpaceGeometryFilter]): def poi_list(request, filters: Query[SpaceGeometryFilter]):
return mapdata_list_endpoint(request, model=POI, filters=filters) 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", @mapdata_api_router.get('/pois/{poi_id}/', summary="POI by ID",
tags=["mapdata-space"], description=schema_description(POISchema), tags=["mapdata-space"], description=schema_description(POISchema),
response={200: POISchema, **API404.dict(), **auth_responses}) response={200: POISchema, **API404.dict(), **auth_responses})
@newapi_etag() @api_etag()
def poi_by_id(request, poi_id: int): def poi_by_id(request, poi_id: int):
return mapdata_retrieve_endpoint(request, POI, pk=poi_id) return mapdata_retrieve_endpoint(request, POI, pk=poi_id)
@ -334,7 +334,7 @@ LeaveDescriptions
@mapdata_api_router.get('/leavedescriptions/', summary="leave description list", @mapdata_api_router.get('/leavedescriptions/', summary="leave description list",
tags=["mapdata-space"], description=schema_description(LeaveDescriptionSchema), tags=["mapdata-space"], description=schema_description(LeaveDescriptionSchema),
response={200: list[LeaveDescriptionSchema], **validate_responses, **auth_responses}) response={200: list[LeaveDescriptionSchema], **validate_responses, **auth_responses})
@newapi_etag() @api_etag()
def leavedescription_list(request, filters: Query[SpaceGeometryFilter]): def leavedescription_list(request, filters: Query[SpaceGeometryFilter]):
return mapdata_list_endpoint(request, model=LeaveDescription, filters=filters) 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", @mapdata_api_router.get('/leavedescriptions/{leavedescription_id}/', summary="leave description by ID",
tags=["mapdata-space"], description=schema_description(LeaveDescriptionSchema), tags=["mapdata-space"], description=schema_description(LeaveDescriptionSchema),
response={200: LeaveDescriptionSchema, **API404.dict(), **auth_responses}) response={200: LeaveDescriptionSchema, **API404.dict(), **auth_responses})
@newapi_etag() @api_etag()
def leavedescription_by_id(request, leavedescription_id: int): def leavedescription_by_id(request, leavedescription_id: int):
return mapdata_retrieve_endpoint(request, LeaveDescription, pk=leavedescription_id) return mapdata_retrieve_endpoint(request, LeaveDescription, pk=leavedescription_id)
@ -355,7 +355,7 @@ CrossDescriptions
@mapdata_api_router.get('/crossdescriptions/', summary="cross description list", @mapdata_api_router.get('/crossdescriptions/', summary="cross description list",
tags=["mapdata-space"], description=schema_description(CrossDescriptionSchema), tags=["mapdata-space"], description=schema_description(CrossDescriptionSchema),
response={200: list[CrossDescriptionSchema], **validate_responses, **auth_responses}) response={200: list[CrossDescriptionSchema], **validate_responses, **auth_responses})
@newapi_etag() @api_etag()
def crossdescription_list(request, filters: Query[SpaceGeometryFilter]): def crossdescription_list(request, filters: Query[SpaceGeometryFilter]):
return mapdata_list_endpoint(request, model=CrossDescription, filters=filters) 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", @mapdata_api_router.get('/crossdescriptions/{crossdescription_id}/', summary="cross description by ID",
tags=["mapdata-space"], description=schema_description(CrossDescriptionSchema), tags=["mapdata-space"], description=schema_description(CrossDescriptionSchema),
response={200: CrossDescriptionSchema, **API404.dict(), **auth_responses}) response={200: CrossDescriptionSchema, **API404.dict(), **auth_responses})
@newapi_etag() @api_etag()
def crossdescription_by_id(request, crossdescription_id: int): def crossdescription_by_id(request, crossdescription_id: int):
return mapdata_retrieve_endpoint(request, CrossDescription, pk=crossdescription_id) return mapdata_retrieve_endpoint(request, CrossDescription, pk=crossdescription_id)
@ -376,7 +376,7 @@ LocationGroup
@mapdata_api_router.get('/locationgroups/', summary="location group list", @mapdata_api_router.get('/locationgroups/', summary="location group list",
tags=["mapdata-root"], description=schema_description(LocationGroupSchema), tags=["mapdata-root"], description=schema_description(LocationGroupSchema),
response={200: list[LocationGroupSchema], **validate_responses, **auth_responses}) response={200: list[LocationGroupSchema], **validate_responses, **auth_responses})
@newapi_etag() @api_etag()
def locationgroup_list(request, filters: Query[ByCategoryFilter]): def locationgroup_list(request, filters: Query[ByCategoryFilter]):
return mapdata_list_endpoint(request, model=LocationGroup, filters=filters) 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", @mapdata_api_router.get('/locationgroups/{locationgroup_id}/', summary="location group by ID",
tags=["mapdata-root"], description=schema_description(LocationGroupSchema), tags=["mapdata-root"], description=schema_description(LocationGroupSchema),
response={200: LocationGroupSchema, **API404.dict(), **auth_responses}) response={200: LocationGroupSchema, **API404.dict(), **auth_responses})
@newapi_etag() @api_etag()
def locationgroup_by_id(request, locationgroup_id: int): def locationgroup_by_id(request, locationgroup_id: int):
return mapdata_retrieve_endpoint(request, LocationGroup, pk=locationgroup_id) return mapdata_retrieve_endpoint(request, LocationGroup, pk=locationgroup_id)
@ -397,7 +397,7 @@ LocationGroupCategories
@mapdata_api_router.get('/locationgroupcategories/', summary="location group category list", @mapdata_api_router.get('/locationgroupcategories/', summary="location group category list",
tags=["mapdata-root"], description=schema_description(LocationGroupCategorySchema), tags=["mapdata-root"], description=schema_description(LocationGroupCategorySchema),
response={200: list[LocationGroupCategorySchema], **auth_responses}) response={200: list[LocationGroupCategorySchema], **auth_responses})
@newapi_etag() @api_etag()
def locationgroupcategory_list(request): def locationgroupcategory_list(request):
return mapdata_list_endpoint(request, model=LocationGroupCategory) 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", @mapdata_api_router.get('/locationgroupcategories/{category_id}/', summary="location group category by ID",
tags=["mapdata-root"], description=schema_description(LocationGroupCategorySchema), tags=["mapdata-root"], description=schema_description(LocationGroupCategorySchema),
response={200: LocationGroupCategorySchema, **API404.dict(), **auth_responses}) response={200: LocationGroupCategorySchema, **API404.dict(), **auth_responses})
@newapi_etag() @api_etag()
def locationgroupcategory_by_id(request, category_id: int): def locationgroupcategory_by_id(request, category_id: int):
return mapdata_retrieve_endpoint(request, LocationGroupCategory, pk=category_id) return mapdata_retrieve_endpoint(request, LocationGroupCategory, pk=category_id)
@ -418,7 +418,7 @@ Sources
@mapdata_api_router.get('/sources/', summary="source list", @mapdata_api_router.get('/sources/', summary="source list",
tags=["mapdata-root"], description=schema_description(SourceSchema), tags=["mapdata-root"], description=schema_description(SourceSchema),
response={200: list[SourceSchema], **auth_responses}) response={200: list[SourceSchema], **auth_responses})
@newapi_etag() @api_etag()
def source_list(request): def source_list(request):
return mapdata_list_endpoint(request, model=Source) 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", @mapdata_api_router.get('/sources/{source_id}/', summary="source by ID",
tags=["mapdata-root"], description=schema_description(SourceSchema), tags=["mapdata-root"], description=schema_description(SourceSchema),
response={200: SourceSchema, **API404.dict(), **auth_responses}) response={200: SourceSchema, **API404.dict(), **auth_responses})
@newapi_etag() @api_etag()
def source_by_id(request, source_id: int): def source_by_id(request, source_id: int):
return mapdata_retrieve_endpoint(request, Source, pk=source_id) return mapdata_retrieve_endpoint(request, Source, pk=source_id)
@ -439,7 +439,7 @@ AccessRestrictions
@mapdata_api_router.get('/accessrestrictions/', summary="access restriction list", @mapdata_api_router.get('/accessrestrictions/', summary="access restriction list",
tags=["mapdata-root"], description=schema_description(AccessRestrictionSchema), tags=["mapdata-root"], description=schema_description(AccessRestrictionSchema),
response={200: list[AccessRestrictionSchema], **auth_responses}) response={200: list[AccessRestrictionSchema], **auth_responses})
@newapi_etag() @api_etag()
def accessrestriction_list(request): def accessrestriction_list(request):
return mapdata_list_endpoint(request, model=AccessRestriction) 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", @mapdata_api_router.get('/accessrestrictions/{accessrestriction_id}/', summary="access restriction by ID",
tags=["mapdata-root"], description=schema_description(AccessRestrictionSchema), tags=["mapdata-root"], description=schema_description(AccessRestrictionSchema),
response={200: AccessRestrictionSchema, **API404.dict(), **auth_responses}) response={200: AccessRestrictionSchema, **API404.dict(), **auth_responses})
@newapi_etag() @api_etag()
def accessrestriction_by_id(request, accessrestriction_id: int): def accessrestriction_by_id(request, accessrestriction_id: int):
return mapdata_retrieve_endpoint(request, AccessRestriction, pk=accessrestriction_id) return mapdata_retrieve_endpoint(request, AccessRestriction, pk=accessrestriction_id)
@ -460,7 +460,7 @@ AccessRestrictionGroups
@mapdata_api_router.get('/accessrestrictiongroups/', summary="access restriction group list", @mapdata_api_router.get('/accessrestrictiongroups/', summary="access restriction group list",
tags=["mapdata-root"], description=schema_description(AccessRestrictionGroupSchema), tags=["mapdata-root"], description=schema_description(AccessRestrictionGroupSchema),
response={200: list[AccessRestrictionGroupSchema], **auth_responses}) response={200: list[AccessRestrictionGroupSchema], **auth_responses})
@newapi_etag() @api_etag()
def accessrestrictiongroup_list(request): def accessrestrictiongroup_list(request):
return mapdata_list_endpoint(request, model=AccessRestrictionGroup) 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", @mapdata_api_router.get('/accessrestrictiongroups/{group_id}/', summary="access restriction group by ID",
tags=["mapdata-root"], description=schema_description(AccessRestrictionGroupSchema), tags=["mapdata-root"], description=schema_description(AccessRestrictionGroupSchema),
response={200: AccessRestrictionGroupSchema, **API404.dict(), **auth_responses}) response={200: AccessRestrictionGroupSchema, **API404.dict(), **auth_responses})
@newapi_etag() @api_etag()
def accessrestrictiongroups_by_id(request, group_id: int): def accessrestrictiongroups_by_id(request, group_id: int):
return mapdata_retrieve_endpoint(request, AccessRestrictionGroup, pk=group_id) return mapdata_retrieve_endpoint(request, AccessRestrictionGroup, pk=group_id)
@ -481,7 +481,7 @@ DynamicLocations
@mapdata_api_router.get('/dynamiclocations/', summary="dynamic location list", @mapdata_api_router.get('/dynamiclocations/', summary="dynamic location list",
tags=["mapdata-root"], description=schema_description(DynamicLocationSchema), tags=["mapdata-root"], description=schema_description(DynamicLocationSchema),
response={200: list[DynamicLocationSchema], **auth_responses}) response={200: list[DynamicLocationSchema], **auth_responses})
@newapi_etag() @api_etag()
def dynamiclocation_list(request): def dynamiclocation_list(request):
return mapdata_list_endpoint(request, model=DynamicLocation) 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", @mapdata_api_router.get('/dynamiclocations/{dynamiclocation_id}/', summary="dynamic location by ID",
tags=["mapdata-root"], description=schema_description(DynamicLocationSchema), tags=["mapdata-root"], description=schema_description(DynamicLocationSchema),
response={200: DynamicLocationSchema, **API404.dict(), **auth_responses}) response={200: DynamicLocationSchema, **API404.dict(), **auth_responses})
@newapi_etag() @api_etag()
def dynamiclocation_by_id(request, dynamiclocation_id: int): def dynamiclocation_by_id(request, dynamiclocation_id: int):
return mapdata_retrieve_endpoint(request, DynamicLocation, pk=dynamiclocation_id) 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 ninja import Schema
from pydantic import PositiveInt 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.api.utils import NonEmptyStr
from c3nav.mapdata.api.base import api_etag
from c3nav.mapdata.models import MapUpdate from c3nav.mapdata.models import MapUpdate
from c3nav.mapdata.newapi.base import newapi_etag
from c3nav.mapdata.schemas.responses import BoundsSchema from c3nav.mapdata.schemas.responses import BoundsSchema
from c3nav.mapdata.utils.cache.stats import increment_cache_key from c3nav.mapdata.utils.cache.stats import increment_cache_key
from c3nav.mapdata.utils.user import get_user_data 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 ninja.pagination import paginate
from pydantic import PositiveInt, field_validator 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.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.dataformats import BoardType, ChipType, FirmwareImage
from c3nav.mesh.messages import MeshMessageType from c3nav.mesh.messages import MeshMessageType
from c3nav.mesh.models import FirmwareBuild, FirmwareVersion, NodeMessage 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 ninja import Schema
from pydantic import NegativeInt, PositiveInt 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.api.utils import NonEmptyStr
from c3nav.mapdata.models.access import AccessPermission from c3nav.mapdata.models.access import AccessPermission
from c3nav.mapdata.schemas.models import CustomLocationSchema from c3nav.mapdata.schemas.models import CustomLocationSchema

View file

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