feat(20241226-fieldpermission): 优化列权限逻辑

1、优化后端合并权限代码
This commit is contained in:
李小涛
2024-12-26 17:37:08 +08:00
parent 6726d0167e
commit 792a22e606

View File

@@ -1,12 +1,25 @@
# -*- coding: utf-8 -*- # -*- coding: utf-8 -*-
from django.db.models import F from django.db.models import F
from rest_framework.decorators import action from rest_framework.decorators import action
from rest_framework.permissions import IsAuthenticated from rest_framework.permissions import IsAuthenticated
from dvadmin.system.models import FieldPermission, MenuField from dvadmin.system.models import FieldPermission, MenuField
from dvadmin.utils.json_response import DetailResponse from dvadmin.utils.json_response import DetailResponse
from dvadmin.utils.models import get_custom_app_models
def merge_permission(data):
"""
合并权限
"""
result = {}
for item in data:
field_name = item.pop('field_name')
if field_name not in result:
result[field_name] = item
else:
for key, value in item.items():
result[field_name][key] = result[field_name][key] or value
return result
class FieldPermissionMixin: class FieldPermissionMixin:
@@ -15,40 +28,16 @@ class FieldPermissionMixin:
""" """
获取字段权限 获取字段权限
""" """
finded = False model = self.serializer_class.Meta.model.__name__
for model in get_custom_app_models():
if model['object'] is self.serializer_class.Meta.model:
finded = True
break
if finded:
break
if finded is False:
return []
user = request.user user = request.user
# 创建一个默认字典来存储最终的结果 # 创建一个默认字典来存储最终的结果
result = {}
if user.is_superuser == 1: if user.is_superuser == 1:
data = MenuField.objects.filter(model=model['model']).values('field_name') data = MenuField.objects.filter(model=model).values('field_name')
for item in data: result = {item['field_name']: {"is_create": True, "is_query": True, "is_update": True} for item in data}
field_name = item.pop('field_name') else:
result[field_name] = {} roles = request.user.role.values_list('id', flat=True)
result[field_name]['is_create'] = True data = FieldPermission.objects.filter(
result[field_name]['is_query'] = True field__model=model, role__in=roles
result[field_name]['is_update'] = True ).values('is_create', 'is_query', 'is_update', field_name=F('field__field_name'))
else: result = merge_permission(data)
roles = request.user.role.values_list('id', flat=True)
data = FieldPermission.objects.filter(
field__model=model['model'], role__in=roles
).values('is_create', 'is_query', 'is_update', field_name=F('field__field_name'))
"""
合并权限
"""
# 遍历原始数据并填充结果字典
for item in data:
field_name = item.pop('field_name')
if field_name not in result:
result[field_name] = item
else:
for key, value in item.items():
result[field_name][key] = result[field_name][key] or value
return DetailResponse(data=result) return DetailResponse(data=result)