87 lines
		
	
	
		
			2.8 KiB
		
	
	
	
		
			Python
		
	
	
	
	
	
			
		
		
	
	
			87 lines
		
	
	
		
			2.8 KiB
		
	
	
	
		
			Python
		
	
	
	
	
	
# -*- coding: utf-8 -*-
 | 
						|
 | 
						|
 | 
						|
from django.db.models import F
 | 
						|
from rest_framework.decorators import action
 | 
						|
from rest_framework.permissions import IsAuthenticated
 | 
						|
 | 
						|
from dvadmin.system.models import RoleMenuPermission, Menu, MenuButton
 | 
						|
from dvadmin.utils.json_response import DetailResponse, ErrorResponse
 | 
						|
from dvadmin.utils.serializers import CustomModelSerializer
 | 
						|
from dvadmin.utils.viewset import CustomModelViewSet
 | 
						|
 | 
						|
 | 
						|
class RoleMenuPermissionSerializer(CustomModelSerializer):
 | 
						|
    """
 | 
						|
    菜单按钮-序列化器
 | 
						|
    """
 | 
						|
 | 
						|
    class Meta:
 | 
						|
        model = RoleMenuPermission
 | 
						|
        fields = "__all__"
 | 
						|
        read_only_fields = ["id"]
 | 
						|
 | 
						|
 | 
						|
class RoleMenuPermissionInitSerializer(CustomModelSerializer):
 | 
						|
    """
 | 
						|
    初始化菜单按钮-序列化器
 | 
						|
    """
 | 
						|
 | 
						|
    class Meta:
 | 
						|
        model = RoleMenuPermission
 | 
						|
        fields = "__all__"
 | 
						|
        read_only_fields = ["id"]
 | 
						|
 | 
						|
class RoleMenuPermissionCreateUpdateSerializer(CustomModelSerializer):
 | 
						|
    """
 | 
						|
    初始化菜单按钮-序列化器
 | 
						|
    """
 | 
						|
 | 
						|
    class Meta:
 | 
						|
        model = RoleMenuPermission
 | 
						|
        fields = "__all__"
 | 
						|
        read_only_fields = ["id"]
 | 
						|
 | 
						|
 | 
						|
class RoleMenuPermissionViewSet(CustomModelViewSet):
 | 
						|
    """
 | 
						|
    菜单按钮接口
 | 
						|
    list:查询
 | 
						|
    create:新增
 | 
						|
    update:修改
 | 
						|
    retrieve:单例
 | 
						|
    destroy:删除
 | 
						|
    """
 | 
						|
    queryset = RoleMenuPermission.objects.all()
 | 
						|
    serializer_class = RoleMenuPermissionSerializer
 | 
						|
    create_serializer_class = RoleMenuPermissionCreateUpdateSerializer
 | 
						|
    update_serializer_class = RoleMenuPermissionCreateUpdateSerializer
 | 
						|
    extra_filter_class = []
 | 
						|
 | 
						|
    @action(methods=['post'],detail=False)
 | 
						|
    def save_auth(self,request):
 | 
						|
        """
 | 
						|
        保存页面菜单授权
 | 
						|
        :param request:
 | 
						|
        :return:
 | 
						|
        """
 | 
						|
        body = request.data
 | 
						|
        role_id = body.get('role',None)
 | 
						|
        if role_id is None:
 | 
						|
            return ErrorResponse(msg="未获取到角色参数")
 | 
						|
        menu_list = body.get('menu',None)
 | 
						|
        if menu_list is None:
 | 
						|
            return ErrorResponse(msg="未获取到菜单参数")
 | 
						|
        obj_list = RoleMenuPermission.objects.filter(role__id=role_id).values_list('menu__id',flat=True)
 | 
						|
        old_set = set(obj_list)
 | 
						|
        new_set = set(menu_list)
 | 
						|
        #need_update = old_set.intersection(new_set) # 需要更新的
 | 
						|
        need_del = old_set.difference(new_set) # 需要删除的
 | 
						|
        need_add = new_set.difference(old_set) # 需要新增的
 | 
						|
        RoleMenuPermission.objects.filter(role__id=role_id,menu__in=list(need_del)).delete()
 | 
						|
        data = [{"role": role_id, "menu": item} for item in list(need_add)]
 | 
						|
        serializer = RoleMenuPermissionSerializer(data=data,many=True,request=request)
 | 
						|
        if serializer.is_valid(raise_exception=True):
 | 
						|
            serializer.save()
 | 
						|
            return DetailResponse(msg="保存成功",data=serializer.data)
 |