From 78b7fbd26819d5d7c9ebf9381ca8531eaee52260 Mon Sep 17 00:00:00 2001 From: junjun Date: Wed, 23 Jul 2025 17:55:04 +0800 Subject: [PATCH] feat: ds table preview column permission --- backend/apps/datasource/api/datasource.py | 4 ++-- backend/apps/datasource/crud/datasource.py | 20 ++++++++++++++++++-- 2 files changed, 20 insertions(+), 4 deletions(-) diff --git a/backend/apps/datasource/api/datasource.py b/backend/apps/datasource/api/datasource.py index e19a1278..a52ffc8b 100644 --- a/backend/apps/datasource/api/datasource.py +++ b/backend/apps/datasource/api/datasource.py @@ -99,8 +99,8 @@ async def edit_field(session: SessionDep, field: CoreField): @router.post("/previewData/{id}") -async def edit_local(session: SessionDep, id: int, data: TableObj): - return preview(session, id, data) +async def edit_local(session: SessionDep, current_user: CurrentUser, id: int, data: TableObj): + return preview(session, current_user, id, data) @router.post("/fieldEnum/{id}") diff --git a/backend/apps/datasource/crud/datasource.py b/backend/apps/datasource/crud/datasource.py index c48c954f..9a7e8a6f 100644 --- a/backend/apps/datasource/crud/datasource.py +++ b/backend/apps/datasource/crud/datasource.py @@ -237,11 +237,27 @@ def updateField(session: SessionDep, field: CoreField): update_field(session, field) -def preview(session: SessionDep, id: int, data: TableObj): +def preview(session: SessionDep, current_user: CurrentUser, id: int, data: TableObj): if data.fields is None or len(data.fields) == 0: return {"fields": [], "data": [], "sql": ''} - fields = [f.field_name for f in data.fields if f.checked] + # column is checked, and, column permission for data.fields + f_list = [f for f in data.fields if f.checked] + column_permissions = session.query(DsPermission).filter( + and_(DsPermission.table_id == data.table.id, DsPermission.type == 'column')).all() + if column_permissions is not None: + for permission in column_permissions: + # check permission and user in same rules + obj = session.query(DsRules).filter( + and_(DsRules.permission_list.op('@>')(cast([permission.id], JSONB)), + or_(DsRules.user_list.op('@>')(cast([f'{current_user.id}'], JSONB)), + DsRules.user_list.op('@>')(cast([current_user.id], JSONB)))) + ).first() + if obj is not None: + permission_list = json.loads(permission.permissions) + f_list = filter_list(f_list, permission_list) + + fields = [f.field_name for f in f_list] if fields is None or len(fields) == 0: return {"fields": [], "data": [], "sql": ''}