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

1import platform 

2 

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 

11 

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 

17 

18 

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 

25 

26 def get_view_name(self): 

27 return "API Root" 

28 

29 @extend_schema(exclude=True) 

30 def get(self, request, format=None): 

31 

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 }) 

46 

47 

48class StatusView(APIView): 

49 """ 

50 A lightweight read-only endpoint for conveying NetBox's current operational status. 

51 """ 

52 permission_classes = [IsAuthenticatedOrLoginNotRequired] 

53 

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 }) 

66 

67 

68class AuthenticationCheckView(APIView): 

69 """ 

70 Return the user making the request, if authenticated successfully. 

71 """ 

72 permission_classes = [IsAuthenticated] 

73 

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)