Coverage for netbox/api/views.py: 94%
32 statements
« prev ^ index » next coverage.py v7.15.2, created at 2026-10-10 18:35 +0000
« prev ^ index » next coverage.py v7.15.2, created at 2026-10-10 18:35 +0000
1import platform
3from django import __version__ as DJANGO_VERSION
4from django.conf import settings
5from drf_spectacular.types import OpenApiTypes
6from drf_spectacular.utils import extend_schema
7from rest_framework.permissions import IsAuthenticated
8from rest_framework.response import Response
9from rest_framework.reverse import reverse
10from rest_framework.views import APIView
12from netbox.api.authentication import IsAuthenticatedOrLoginNotRequired
13from netbox.plugins.utils import get_installed_plugins
14from users.api.serializers import UserSerializer
15from utilities.apps import get_installed_apps
16from utilities.rqworker import get_all_workers
19class APIRootView(APIView):
20 """
21 This is the root of NetBox's REST API. API endpoints are arranged by app and model name; e.g. `/api/dcim/sites/`.
22 """
23 _ignore_model_permissions = True
24 # schema = None
26 def get_view_name(self):
27 return "API Root"
29 @extend_schema(exclude=True)
30 def get(self, request, format=None):
32 return Response({
33 'circuits': reverse('circuits-api:api-root', request=request, format=format),
34 'core': reverse('core-api:api-root', request=request, format=format),
35 'dcim': reverse('dcim-api:api-root', request=request, format=format),
36 'extras': reverse('extras-api:api-root', request=request, format=format),
37 'ipam': reverse('ipam-api:api-root', request=request, format=format),
38 'plugins': reverse('plugins-api:api-root', request=request, format=format),
39 'status': reverse('api-status', request=request, format=format),
40 'tenancy': reverse('tenancy-api:api-root', request=request, format=format),
41 'users': reverse('users-api:api-root', request=request, format=format),
42 'virtualization': reverse('virtualization-api:api-root', request=request, format=format),
43 'vpn': reverse('vpn-api:api-root', request=request, format=format),
44 'wireless': reverse('wireless-api:api-root', request=request, format=format),
45 })
48class StatusView(APIView):
49 """
50 A lightweight read-only endpoint for conveying NetBox's current operational status.
51 """
52 permission_classes = [IsAuthenticatedOrLoginNotRequired]
54 @extend_schema(responses={200: OpenApiTypes.OBJECT})
55 def get(self, request):
56 return Response({
57 'django-version': DJANGO_VERSION,
58 'hostname': settings.HOSTNAME,
59 'installed_apps': get_installed_apps(),
60 'netbox-version': settings.RELEASE.version,
61 'netbox-full-version': settings.RELEASE.full_version,
62 'plugins': get_installed_plugins(),
63 'python-version': platform.python_version(),
64 'rq-workers-running': len(get_all_workers()),
65 })
68class AuthenticationCheckView(APIView):
69 """
70 Return the user making the request, if authenticated successfully.
71 """
72 permission_classes = [IsAuthenticated]
74 @extend_schema(responses={200: OpenApiTypes.OBJECT})
75 def get(self, request):
76 serializer = UserSerializer(request.user, context={'request': request})
77 return Response(serializer.data)