|
|
from drf_yasg.utils import swagger_auto_schema
|
|
|
from rest_framework import status
|
|
|
from rest_framework.decorators import action
|
|
|
from rest_framework.response import Response
|
|
|
from rest_framework.viewsets import ModelViewSet
|
|
|
|
|
|
from erp_system.models import RolesModel, PermissionsModel, Menu
|
|
|
from erp_system.serializers.roles_serialzier import RolesPartialSerializer, RoleSetPermissionSerializer, RolesSerializer
|
|
|
|
|
|
|
|
|
class RolesViewSet(ModelViewSet):
|
|
|
# 整个ERP系统有一个默认存在的角色(特殊), admin角色。这个角色不允许删除
|
|
|
"""
|
|
|
create:
|
|
|
角色--新增
|
|
|
|
|
|
角色新增, status: 201(成功), return: 新增角色信息
|
|
|
|
|
|
destroy:
|
|
|
角色--删除
|
|
|
|
|
|
角色删除, status: 204(成功), return: None
|
|
|
|
|
|
multiple_delete:
|
|
|
角色--批量删除,必传参数:ids=[1,2,3,4...]
|
|
|
|
|
|
角色批量删除, status: 204(成功), return: None
|
|
|
|
|
|
update:
|
|
|
角色--修改,不能修改角色,只是修改角色名字。
|
|
|
|
|
|
角色修改, status: 200(成功), return: 修改后的角色信息
|
|
|
|
|
|
partial_update:
|
|
|
角色--(不需要)局部修改(角色批量授权),针对某一个角色批量授权,之前存在的不变,之前没有的会增加权限
|
|
|
|
|
|
角色批量授权, status: 200(成功), return: 修改后的角色信息
|
|
|
|
|
|
set_permission_to_role:
|
|
|
角色--单个授权,一次只能授予角色一个permission,也可以取消一个permission
|
|
|
status: 200(成功), return: 修改后的角色信息
|
|
|
|
|
|
list:
|
|
|
角色--获取列表
|
|
|
|
|
|
角色列表信息, status: 200(成功), return: 角色信息列表
|
|
|
|
|
|
retrieve:
|
|
|
查询某一个角色
|
|
|
|
|
|
查询指定ID的角色, status: 200(成功), return: 用户角色
|
|
|
"""
|
|
|
|
|
|
queryset = RolesModel.objects.all()
|
|
|
|
|
|
def get_serializer_class(self):
|
|
|
"""
|
|
|
不同的视图函数采用的序列化器是不一样的
|
|
|
:return:
|
|
|
"""
|
|
|
if self.action == 'partial_update':
|
|
|
return RolesPartialSerializer
|
|
|
elif self.action == 'set_permission_to_role':
|
|
|
return RoleSetPermissionSerializer
|
|
|
else:
|
|
|
return RolesSerializer
|
|
|
|
|
|
@swagger_auto_schema(method='POST', request_body=RoleSetPermissionSerializer, operation_description='单一授权或者取消单一权限')
|
|
|
@action(methods=['POST'], detail=False)
|
|
|
def set_permission_to_role(self, request, *args, **kwargs):
|
|
|
ser: RoleSetPermissionSerializer = self.get_serializer(data=request.data)
|
|
|
if ser.is_valid():
|
|
|
role = RolesModel.objects.get(id=ser.validated_data.get('role_id'))
|
|
|
permission = PermissionsModel.objects.get(id=ser.validated_data.get('permission_id'))
|
|
|
if ser.validated_data.get('is_create'):
|
|
|
# 判断给当前角色新增一个权限, 首先判断该权限所对应的父菜单权限是否已经被授予了
|
|
|
parent = Menu.objects.filter(id=permission.menu.id).values_list('parent', flat=True).all()
|
|
|
if parent:
|
|
|
p_permission = PermissionsModel.objects.get(menu_id=parent[0])
|
|
|
role.permissions.add(p_permission)
|
|
|
role.permissions.add(permission)
|
|
|
else: # 取消权限
|
|
|
role.permissions.remove(permission)
|
|
|
|
|
|
return Response(data=RolesSerializer(instance=role).data)
|
|
|
|
|
|
|
|
|
def destroy(self, request, *args, **kwargs):
|
|
|
if self.get_object().name == 'admin':
|
|
|
return Response(data={'detail': 'admin角色不可删除'}, status=status.HTTP_400_BAD_REQUEST)
|
|
|
else:
|
|
|
pass |