1
0
mirror of https://github.com/netbox-community/netbox.git synced 2024-05-10 07:54:54 +00:00

Initial work on REST API endpoint for tokens

This commit is contained in:
jeremystretch
2021-06-11 15:14:19 -04:00
parent d87ec82fe3
commit 48b4bf1683
8 changed files with 108 additions and 6 deletions

View File

@@ -3,11 +3,12 @@ from django.contrib.contenttypes.models import ContentType
from rest_framework import serializers
from netbox.api import ContentTypeField, WritableNestedSerializer
from users.models import ObjectPermission
from users.models import ObjectPermission, Token
__all__ = [
'NestedGroupSerializer',
'NestedObjectPermissionSerializer',
'NestedTokenSerializer',
'NestedUserSerializer',
]
@@ -28,6 +29,14 @@ class NestedUserSerializer(WritableNestedSerializer):
fields = ['id', 'url', 'display', 'username']
class NestedTokenSerializer(WritableNestedSerializer):
url = serializers.HyperlinkedIdentityField(view_name='users-api:token-detail')
class Meta:
model = Token
fields = ['id', 'url', 'display', 'key', 'write_enabled']
class NestedObjectPermissionSerializer(WritableNestedSerializer):
url = serializers.HyperlinkedIdentityField(view_name='users-api:objectpermission-detail')
object_types = ContentTypeField(

View File

@@ -3,10 +3,18 @@ from django.contrib.contenttypes.models import ContentType
from rest_framework import serializers
from netbox.api import ContentTypeField, SerializedPKRelatedField, ValidatedModelSerializer
from users.models import ObjectPermission
from users.models import ObjectPermission, Token
from .nested_serializers import *
__all__ = (
'GroupSerializer',
'ObjectPermissionSerializer',
'TokenSerializer',
'UserSerializer',
)
class UserSerializer(ValidatedModelSerializer):
url = serializers.HyperlinkedIdentityField(view_name='users-api:user-detail')
groups = SerializedPKRelatedField(
@@ -47,6 +55,21 @@ class GroupSerializer(ValidatedModelSerializer):
fields = ('id', 'url', 'display', 'name', 'user_count')
class TokenSerializer(ValidatedModelSerializer):
url = serializers.HyperlinkedIdentityField(view_name='users-api:token-detail')
key = serializers.CharField(min_length=40, max_length=40, allow_blank=True, required=False)
user = NestedUserSerializer()
class Meta:
model = Token
fields = ('id', 'url', 'display', 'user', 'created', 'expires', 'key', 'write_enabled', 'description')
def to_internal_value(self, data):
if 'key' not in data:
data['key'] = Token.generate_key()
return super().to_internal_value(data)
class ObjectPermissionSerializer(ValidatedModelSerializer):
url = serializers.HyperlinkedIdentityField(view_name='users-api:objectpermission-detail')
object_types = ContentTypeField(

View File

@@ -9,6 +9,9 @@ router.APIRootView = views.UsersRootView
router.register('users', views.UserViewSet)
router.register('groups', views.GroupViewSet)
# Tokens
router.register('tokens', views.TokenViewSet)
# Permissions
router.register('permissions', views.ObjectPermissionViewSet)

View File

@@ -7,7 +7,7 @@ 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 +37,25 @@ 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()
if self.request.user.is_superuser:
return queryset
return queryset.filter(user=self.request.user)
#
# ObjectPermissions
#