|
|
@@ -1,13 +1,17 @@
|
|
|
+from django.contrib.auth import authenticate
|
|
|
from django.contrib.auth.models import Group, User
|
|
|
from django.db.models import Count
|
|
|
+from rest_framework.exceptions import AuthenticationFailed
|
|
|
from rest_framework.permissions import IsAuthenticated
|
|
|
from rest_framework.response import Response
|
|
|
from rest_framework.routers import APIRootView
|
|
|
+from rest_framework.status import HTTP_201_CREATED
|
|
|
+from rest_framework.views import APIView
|
|
|
from rest_framework.viewsets import ViewSet
|
|
|
|
|
|
from netbox.api.views import ModelViewSet
|
|
|
from users import filtersets
|
|
|
-from users.models import ObjectPermission, UserConfig
|
|
|
+from users.models import ObjectPermission, Token, UserConfig
|
|
|
from utilities.querysets import RestrictedQuerySet
|
|
|
from utilities.utils import deepmerge
|
|
|
from . import serializers
|
|
|
@@ -37,6 +41,55 @@ class GroupViewSet(ModelViewSet):
|
|
|
filterset_class = filtersets.GroupFilterSet
|
|
|
|
|
|
|
|
|
+#
|
|
|
+# REST API tokens
|
|
|
+#
|
|
|
+
|
|
|
+class TokenViewSet(ModelViewSet):
|
|
|
+ queryset = RestrictedQuerySet(model=Token).prefetch_related('user')
|
|
|
+ serializer_class = serializers.TokenSerializer
|
|
|
+ filterset_class = filtersets.TokenFilterSet
|
|
|
+
|
|
|
+ def get_queryset(self):
|
|
|
+ """
|
|
|
+ Limit the non-superusers to their own Tokens.
|
|
|
+ """
|
|
|
+ queryset = super().get_queryset()
|
|
|
+ # Workaround for schema generation (drf_yasg)
|
|
|
+ if getattr(self, 'swagger_fake_view', False):
|
|
|
+ return queryset.none()
|
|
|
+ if self.request.user.is_superuser:
|
|
|
+ return queryset
|
|
|
+ return queryset.filter(user=self.request.user)
|
|
|
+
|
|
|
+
|
|
|
+class TokenProvisionView(APIView):
|
|
|
+ """
|
|
|
+ Non-authenticated REST API endpoint via which a user may create a Token.
|
|
|
+ """
|
|
|
+ permission_classes = []
|
|
|
+
|
|
|
+ def post(self, request):
|
|
|
+ serializer = serializers.TokenProvisionSerializer(data=request.data)
|
|
|
+ serializer.is_valid()
|
|
|
+
|
|
|
+ # Authenticate the user account based on the provided credentials
|
|
|
+ user = authenticate(
|
|
|
+ request=request,
|
|
|
+ username=serializer.data['username'],
|
|
|
+ password=serializer.data['password']
|
|
|
+ )
|
|
|
+ if user is None:
|
|
|
+ raise AuthenticationFailed("Invalid username/password")
|
|
|
+
|
|
|
+ # Create a new Token for the User
|
|
|
+ token = Token(user=user)
|
|
|
+ token.save()
|
|
|
+ data = serializers.TokenSerializer(token, context={'request': request}).data
|
|
|
+
|
|
|
+ return Response(data, status=HTTP_201_CREATED)
|
|
|
+
|
|
|
+
|
|
|
#
|
|
|
# ObjectPermissions
|
|
|
#
|