diff --git a/backend/application/settings.py b/backend/application/settings.py index 1d0adf79b43c695cbb576518c213ea2837303a07..e6bdec5eaa5fa6bc0778592ace87c8da995262ef 100644 --- a/backend/application/settings.py +++ b/backend/application/settings.py @@ -404,7 +404,7 @@ PLUGINS_URL_PATTERNS = [] # ********** 一键导入插件配置开始 ********** # 例如: # from dvadmin_upgrade_center.settings import * # 升级中心 -from dvadmin3_celery.settings import * # celery 异步任务 +# from dvadmin3_celery.settings import * # celery 异步任务 # from dvadmin_third.settings import * # 第三方用户管理 # from dvadmin_ak_sk.settings import * # 秘钥管理管理 # from dvadmin_tenants.settings import * # 租户管理 diff --git a/backend/dvadmin/utils/field_permission.py b/backend/dvadmin/utils/field_permission.py index 7c259f6820b2040171c9db8f2d06b25b35ea9d95..87026845f3972ce67daf4a0833e2e0aee918f00d 100644 --- a/backend/dvadmin/utils/field_permission.py +++ b/backend/dvadmin/utils/field_permission.py @@ -1,71 +1,43 @@ # -*- coding: utf-8 -*- - -from itertools import groupby - from django.db.models import F from rest_framework.decorators import action from rest_framework.permissions import IsAuthenticated from dvadmin.system.models import FieldPermission, MenuField 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: - @action(methods=['get'], detail=False,permission_classes=[IsAuthenticated]) + @action(methods=['get'], detail=False, permission_classes=[IsAuthenticated]) def field_permission(self, request): """ 获取字段权限 """ - finded = False - 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 [] + model = self.serializer_class.Meta.model.__name__ user = request.user - if user.is_superuser==1: - data = MenuField.objects.filter( model=model['model']).values('field_name') - for item in data: - item['is_create'] = True - item['is_query'] = True - item['is_update'] = True + # 创建一个默认字典来存储最终的结果 + if user.is_superuser == 1: + data = MenuField.objects.filter(model=model).values('field_name') + result = {item['field_name']: {"is_create": True, "is_query": True, "is_update": True} for item in data} else: 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')) - - """ - 合并权限 - - 这段代码首先根据 field_name 对列表进行排序, - 然后使用 groupby 按 field_name 进行分组。 - 对于每个组,它创建一个新的字典 merged, - 并遍历组中的每个字典,将布尔值字段使用逻辑或(or)操作符进行合并(如果 merged 中还没有该字段,则默认为 False), - 其他字段(如 field_name)则直接取组的关键字(即 key) - """ - - # 使用field_name对列表进行分组, # groupby 需要先对列表进行排序,因为它只能对连续相同的元素进行分组。 - grouped = groupby(sorted(list(data), key=lambda x: x['field_name']), key=lambda x: x['field_name']) - - data = [] - - # 遍历分组,合并权限 - for key, group in grouped: - - # 初始化一个空字典来存储合并后的结果 - merged = {} - for item in group: - # 合并权限, True值优先 - merged['is_create'] = merged.get('is_create', False) or item['is_create'] - merged['is_query'] = merged.get('is_query', False) or item['is_query'] - merged['is_update'] = merged.get('is_update', False) or item['is_update'] - merged['field_name'] = key - - data.append(merged) - - return DetailResponse(data=data) \ No newline at end of file + data = FieldPermission.objects.filter( + field__model=model, role__in=roles + ).values('is_create', 'is_query', 'is_update', field_name=F('field__field_name')) + result = merge_permission(data) + return DetailResponse(data=result) diff --git a/web/src/utils/columnPermission.ts b/web/src/utils/columnPermission.ts index adff4e1fef8c539e3dba8e6fe8e79a5f26439e73..e58c9347cb428b6993089abcf35f560244da8ad4 100644 --- a/web/src/utils/columnPermission.ts +++ b/web/src/utils/columnPermission.ts @@ -1,3 +1,4 @@ +import XEUtils from 'xe-utils'; import {useColumnPermission} from '/@/stores/columnPermission'; type permissionType = 'is_create' | 'is_query' | 'is_update'; @@ -23,25 +24,17 @@ export const handleColumnPermission = async (func: Function, crudOptions: any,ex } const columns = crudOptions.columns; const excludeColumns = ['checked','_index','id', 'create_datetime', 'update_datetime'].concat(excludeColumn) - for (let col in columns) { - for (let item of res.data) { - if (excludeColumns.includes(item.field_name)) { - continue - } else if(item.field_name === col) { - // 如果列表不可见,则禁止在列设置中选择 - // 只有列表不可见,才修改列配置,这样才不影响默认的配置 - if(!item['is_query']){ - columns[col].column.show = false - columns[col].column.columnSetDisabled = true - } - columns[col].addForm = { - show: item['is_create'] - } - columns[col].editForm = { - show: item['is_update'] - } + XEUtils.eachTree(columns, (item, key) => { + if (!excludeColumns.includes(String(key)) && key in res.data) { + // 如果列表不可见,则禁止在列设置中选择 + // 只有列表不可见,才修改列配置,这样才不影响默认的配置 + if (!res.data[key]['is_query']) { + item.column.show = false; + item.column.columnSetDisabled = true; } + item.addForm = { show: res.data[key]['is_create'] }; + item.editForm = { show: res.data[key]['is_update'] }; } - } + }); return crudOptions }