2020-07-22 11:21:51 -04:00
|
|
|
from django.contrib.auth.models import Group, User
|
|
|
|
from django.db.models import Count
|
2020-10-21 09:05:33 -04:00
|
|
|
from rest_framework.permissions import IsAuthenticated
|
|
|
|
from rest_framework.response import Response
|
2020-08-13 12:45:38 -04:00
|
|
|
from rest_framework.routers import APIRootView
|
2020-10-21 09:05:33 -04:00
|
|
|
from rest_framework.viewsets import ViewSet
|
2020-07-22 11:21:51 -04:00
|
|
|
|
2020-10-13 15:54:23 -04:00
|
|
|
from netbox.api.views import ModelViewSet
|
2020-07-22 11:21:51 -04:00
|
|
|
from users import filters
|
2020-10-21 09:05:33 -04:00
|
|
|
from users.models import ObjectPermission, UserConfig
|
2020-07-22 11:21:51 -04:00
|
|
|
from utilities.querysets import RestrictedQuerySet
|
2020-10-29 14:15:38 -04:00
|
|
|
from utilities.utils import deepmerge
|
2020-06-03 13:08:04 -04:00
|
|
|
from . import serializers
|
|
|
|
|
2020-07-22 11:21:51 -04:00
|
|
|
|
2020-08-13 12:45:38 -04:00
|
|
|
class UsersRootView(APIRootView):
|
|
|
|
"""
|
|
|
|
Users API root view
|
|
|
|
"""
|
|
|
|
def get_view_name(self):
|
|
|
|
return 'Users'
|
|
|
|
|
|
|
|
|
2020-07-22 11:21:51 -04:00
|
|
|
#
|
|
|
|
# Users and groups
|
|
|
|
#
|
|
|
|
|
|
|
|
class UserViewSet(ModelViewSet):
|
2020-07-23 13:46:40 -04:00
|
|
|
queryset = RestrictedQuerySet(model=User).prefetch_related('groups').order_by('username')
|
2020-07-22 11:21:51 -04:00
|
|
|
serializer_class = serializers.UserSerializer
|
2020-07-22 13:48:04 -04:00
|
|
|
filterset_class = filters.UserFilterSet
|
2020-07-22 11:21:51 -04:00
|
|
|
|
|
|
|
|
|
|
|
class GroupViewSet(ModelViewSet):
|
2020-07-23 13:46:40 -04:00
|
|
|
queryset = RestrictedQuerySet(model=Group).annotate(user_count=Count('user')).order_by('name')
|
2020-07-22 11:21:51 -04:00
|
|
|
serializer_class = serializers.GroupSerializer
|
2020-07-22 13:48:04 -04:00
|
|
|
filterset_class = filters.GroupFilterSet
|
2020-06-03 13:08:04 -04:00
|
|
|
|
|
|
|
|
|
|
|
#
|
|
|
|
# ObjectPermissions
|
|
|
|
#
|
|
|
|
|
|
|
|
class ObjectPermissionViewSet(ModelViewSet):
|
|
|
|
queryset = ObjectPermission.objects.prefetch_related('object_types', 'groups', 'users')
|
|
|
|
serializer_class = serializers.ObjectPermissionSerializer
|
2020-07-22 16:34:16 -04:00
|
|
|
filterset_class = filters.ObjectPermissionFilterSet
|
2020-10-21 09:05:33 -04:00
|
|
|
|
|
|
|
|
|
|
|
#
|
|
|
|
# User preferences
|
|
|
|
#
|
|
|
|
|
|
|
|
class UserConfigViewSet(ViewSet):
|
|
|
|
"""
|
|
|
|
An API endpoint via which a user can update his or her own UserConfig data (but no one else's).
|
|
|
|
"""
|
|
|
|
permission_classes = [IsAuthenticated]
|
|
|
|
|
|
|
|
def get_queryset(self):
|
|
|
|
return UserConfig.objects.filter(user=self.request.user)
|
|
|
|
|
|
|
|
def list(self, request):
|
|
|
|
"""
|
|
|
|
Return the UserConfig for the currently authenticated User.
|
|
|
|
"""
|
|
|
|
userconfig = self.get_queryset().first()
|
|
|
|
|
|
|
|
return Response(userconfig.data)
|
|
|
|
|
|
|
|
def patch(self, request):
|
|
|
|
"""
|
|
|
|
Update the UserConfig for the currently authenticated User.
|
|
|
|
"""
|
|
|
|
# TODO: How can we validate this data?
|
|
|
|
userconfig = self.get_queryset().first()
|
2020-10-29 14:15:38 -04:00
|
|
|
userconfig.data = deepmerge(userconfig.data, request.data)
|
2020-10-21 09:05:33 -04:00
|
|
|
userconfig.save()
|
|
|
|
|
|
|
|
return Response(userconfig.data)
|