- Update groups add, remove and users add, remove methods trigger only one event on the parent method and multiple on the child method. - Add missing group_list, _add, _remove permissions. - Monkey patch Django's User and Group model save method to trigger the creation and edited events. - Monkeypatch user sorting to silence warnings. - Improve test mixins to allow reuse of view and API view requests. - Finish adding all API tests. - Add events test from API view requests. - Remove event commits from views. Signed-off-by: Roberto Rosario <Roberto.Rosario@mayan-edms.com>
164 lines
5.7 KiB
Python
164 lines
5.7 KiB
Python
from __future__ import unicode_literals
|
|
|
|
from django.contrib.auth.models import Group
|
|
|
|
from rest_framework import generics, status
|
|
from rest_framework.decorators import action
|
|
from rest_framework.permissions import IsAuthenticated
|
|
from rest_framework.response import Response
|
|
|
|
from mayan.apps.rest_api.viewsets import MayanAPIModelViewSet
|
|
|
|
from .permissions import (
|
|
permission_group_create, permission_group_delete, permission_group_edit,
|
|
permission_group_view, permission_user_create, permission_user_delete,
|
|
permission_user_edit, permission_user_view
|
|
)
|
|
from .serializers import (
|
|
CurrentUserSerializer, GroupUserAddRemoveSerializer, GroupSerializer,
|
|
UserGroupAddRemoveSerializer, UserSerializer
|
|
)
|
|
from .querysets import get_user_queryset
|
|
|
|
|
|
class CurrentUserAPIView(generics.RetrieveUpdateAPIView):
|
|
permission_classes = (IsAuthenticated,)
|
|
serializer_class = CurrentUserSerializer
|
|
|
|
def get_object(self):
|
|
return self.request.user
|
|
|
|
|
|
class GroupAPIViewSet(MayanAPIModelViewSet):
|
|
lookup_url_kwarg = 'group_id'
|
|
object_permission_map = {
|
|
'destroy': permission_group_delete,
|
|
'list': permission_group_view,
|
|
'partial_update': permission_group_edit,
|
|
'retrieve': permission_group_view,
|
|
'update': permission_group_edit,
|
|
'user_add': permission_group_edit,
|
|
'user_list': permission_group_view,
|
|
'user_remove': permission_group_edit
|
|
}
|
|
queryset = Group.objects.all()
|
|
serializer_class = GroupSerializer
|
|
view_permission_map = {
|
|
'create': permission_group_create
|
|
}
|
|
|
|
@action(
|
|
detail=True, lookup_url_kwarg='group_id', methods=('post',),
|
|
serializer_class=GroupUserAddRemoveSerializer,
|
|
url_name='user-add', url_path='users/add'
|
|
)
|
|
def user_add(self, request, *args, **kwargs):
|
|
instance = self.get_object()
|
|
serializer = self.get_serializer(data=request.data)
|
|
serializer.is_valid(raise_exception=True)
|
|
serializer.users_add(instance=instance)
|
|
headers = self.get_success_headers(data=serializer.data)
|
|
return Response(
|
|
serializer.data, status=status.HTTP_200_OK, headers=headers
|
|
)
|
|
|
|
@action(
|
|
detail=True, lookup_url_kwarg='group_id',
|
|
serializer_class=UserSerializer, url_name='user-list',
|
|
url_path='users'
|
|
)
|
|
def user_list(self, request, *args, **kwargs):
|
|
queryset = self.get_object().get_users(_user=self.request.user)
|
|
page = self.paginate_queryset(queryset)
|
|
|
|
serializer = self.get_serializer(
|
|
queryset, many=True, context={'request': request}
|
|
)
|
|
|
|
if page is not None:
|
|
return self.get_paginated_response(serializer.data)
|
|
|
|
return Response(serializer.data)
|
|
|
|
@action(
|
|
detail=True, lookup_url_kwarg='group_id',
|
|
methods=('post',), serializer_class=GroupUserAddRemoveSerializer,
|
|
url_name='user-remove', url_path='users/remove'
|
|
)
|
|
def user_remove(self, request, *args, **kwargs):
|
|
instance = self.get_object()
|
|
serializer = self.get_serializer(data=request.data)
|
|
serializer.is_valid(raise_exception=True)
|
|
serializer.users_remove(instance=instance)
|
|
headers = self.get_success_headers(data=serializer.data)
|
|
return Response(
|
|
serializer.data, status=status.HTTP_200_OK, headers=headers
|
|
)
|
|
|
|
|
|
class UserAPIViewSet(MayanAPIModelViewSet):
|
|
lookup_url_kwarg = 'user_id'
|
|
object_permission_map = {
|
|
'destroy': permission_user_delete,
|
|
'group_add': permission_user_edit,
|
|
'group_list': permission_user_view,
|
|
'group_remove': permission_user_edit,
|
|
'list': permission_user_view,
|
|
'partial_update': permission_user_edit,
|
|
'retrieve': permission_user_view,
|
|
'update': permission_user_edit,
|
|
}
|
|
queryset = get_user_queryset()
|
|
serializer_class = UserSerializer
|
|
view_permission_map = {
|
|
'create': permission_user_create
|
|
}
|
|
|
|
@action(
|
|
detail=True, lookup_url_kwarg='user_id', methods=('post',),
|
|
serializer_class=UserGroupAddRemoveSerializer,
|
|
url_name='group-add', url_path='groups/add'
|
|
)
|
|
def group_add(self, request, *args, **kwargs):
|
|
instance = self.get_object()
|
|
serializer = self.get_serializer(data=request.data)
|
|
serializer.is_valid(raise_exception=True)
|
|
serializer.groups_add(instance=instance)
|
|
headers = self.get_success_headers(data=serializer.data)
|
|
return Response(
|
|
serializer.data, status=status.HTTP_200_OK, headers=headers
|
|
)
|
|
|
|
@action(
|
|
detail=True, lookup_url_kwarg='user_id',
|
|
serializer_class=GroupSerializer, url_name='group-list',
|
|
url_path='groups'
|
|
)
|
|
def group_list(self, request, *args, **kwargs):
|
|
queryset = self.get_object().get_groups(_user=self.request.user)
|
|
page = self.paginate_queryset(queryset)
|
|
|
|
serializer = self.get_serializer(
|
|
queryset, many=True, context={'request': request}
|
|
)
|
|
|
|
if page is not None:
|
|
return self.get_paginated_response(serializer.data)
|
|
|
|
return Response(serializer.data)
|
|
|
|
@action(
|
|
detail=True, lookup_url_kwarg='user_id',
|
|
methods=('post',), serializer_class=UserGroupAddRemoveSerializer,
|
|
url_name='group-remove', url_path='groups/remove'
|
|
)
|
|
def group_remove(self, request, *args, **kwargs):
|
|
instance = self.get_object()
|
|
serializer = self.get_serializer(data=request.data)
|
|
serializer.is_valid(raise_exception=True)
|
|
serializer.groups_remove(instance=instance)
|
|
headers = self.get_success_headers(data=serializer.data)
|
|
return Response(
|
|
serializer.data, status=status.HTTP_200_OK, headers=headers
|
|
)
|