|
3 | 3 | from typing import List, Optional |
4 | 4 |
|
5 | 5 | from fastapi import HTTPException |
6 | | -from sqlalchemy import and_, text, cast, or_, func |
7 | | -from sqlalchemy.dialects.postgresql import JSONB |
8 | | -from sqlbot_xpack.permissions.api.permission import transRecord2DTO |
9 | | -from sqlbot_xpack.permissions.models.ds_permission import DsPermission, PermissionDTO |
10 | | -from sqlbot_xpack.permissions.models.ds_rules import DsRules |
| 6 | +from sqlalchemy import and_, text, func |
| 7 | + |
11 | 8 | from sqlmodel import select |
12 | 9 |
|
13 | | -from apps.datasource.crud.row_permission import transFilterTree |
| 10 | + |
14 | 11 | from apps.datasource.utils.utils import aes_decrypt |
15 | 12 | from apps.db.constant import DB |
16 | 13 | from apps.db.db import get_engine, get_tables, get_fields, exec_sql |
|
23 | 20 | from ..crud.table import delete_table_by_ds_id, update_table |
24 | 21 | from ..models.datasource import CoreDatasource, CreateDatasource, CoreTable, CoreField, ColumnSchema, TableObj, \ |
25 | 22 | DatasourceConf, TableAndFields |
26 | | - |
| 23 | +from apps.datasource.crud.permission import get_column_permission_fields, get_row_permission_filters, is_normal_user |
27 | 24 |
|
28 | 25 | def get_datasource_list(session: SessionDep, user: CurrentUser, oid: Optional[int] = None) -> List[CoreDatasource]: |
29 | 26 | current_oid = user.oid if user.oid is not None else 1 |
@@ -252,35 +249,14 @@ def preview(session: SessionDep, current_user: CurrentUser, id: int, data: Table |
252 | 249 | f_list = [f for f in data.fields if f.checked] |
253 | 250 | if is_normal_user(current_user): |
254 | 251 | # column is checked, and, column permission for data.fields |
255 | | - column_permissions = session.query(DsPermission).filter( |
256 | | - and_(DsPermission.table_id == data.table.id, DsPermission.type == 'column')).all() |
257 | | - if column_permissions is not None: |
258 | | - for permission in column_permissions: |
259 | | - # check permission and user in same rules |
260 | | - obj = session.query(DsRules).filter( |
261 | | - and_(DsRules.permission_list.op('@>')(cast([permission.id], JSONB)), |
262 | | - or_(DsRules.user_list.op('@>')(cast([f'{current_user.id}'], JSONB)), |
263 | | - DsRules.user_list.op('@>')(cast([current_user.id], JSONB)))) |
264 | | - ).first() |
265 | | - if obj is not None: |
266 | | - permission_list = json.loads(permission.permissions) |
267 | | - f_list = filter_list(f_list, permission_list) |
| 252 | + f_list = get_column_permission_fields(session=session, current_user=current_user, table=data.table, fields=f_list) or f_list |
268 | 253 |
|
269 | 254 | # row permission tree |
270 | | - row_permissions = session.query(DsPermission).filter( |
271 | | - and_(DsPermission.table_id == data.table.id, DsPermission.type == 'row')).all() |
272 | | - res: List[PermissionDTO] = [] |
273 | | - if row_permissions is not None: |
274 | | - for permission in row_permissions: |
275 | | - # check permission and user in same rules |
276 | | - obj = session.query(DsRules).filter( |
277 | | - and_(DsRules.permission_list.op('@>')(cast([permission.id], JSONB)), |
278 | | - or_(DsRules.user_list.op('@>')(cast([f'{current_user.id}'], JSONB)), |
279 | | - DsRules.user_list.op('@>')(cast([current_user.id], JSONB)))) |
280 | | - ).first() |
281 | | - if obj is not None: |
282 | | - res.append(transRecord2DTO(session, permission)) |
283 | | - where_str = transFilterTree(session, res, ds) |
| 255 | + where_str = '' |
| 256 | + filter_mapping = get_row_permission_filters(session=session, current_user=current_user, ds=ds, tables=None, single_table=data.table) |
| 257 | + if filter_mapping: |
| 258 | + mapping_dict = filter_mapping[0] |
| 259 | + where_str = mapping_dict.get('filter') |
284 | 260 | where = (' where ' + where_str) if where_str is not None and where_str != '' else '' |
285 | 261 |
|
286 | 262 | fields = [f.field_name for f in f_list] |
@@ -349,25 +325,13 @@ def get_table_obj_by_ds(session: SessionDep, current_user: CurrentUser, ds: Core |
349 | 325 | fields = session.query(CoreField).filter(and_(CoreField.table_id == table.id, CoreField.checked == True)).all() |
350 | 326 |
|
351 | 327 | # do column permissions, filter fields |
352 | | - if is_normal_user(current_user): |
353 | | - column_permissions = session.query(DsPermission).filter( |
354 | | - and_(DsPermission.table_id == table.id, DsPermission.type == 'column')).all() |
355 | | - if column_permissions is not None: |
356 | | - for permission in column_permissions: |
357 | | - # check permission and user in same rules |
358 | | - obj = session.query(DsRules).filter( |
359 | | - and_(DsRules.permission_list.op('@>')(cast([permission.id], JSONB)), |
360 | | - or_(DsRules.user_list.op('@>')(cast([f'{current_user.id}'], JSONB)), |
361 | | - DsRules.user_list.op('@>')(cast([current_user.id], JSONB)))) |
362 | | - ).first() |
363 | | - if obj is not None: |
364 | | - permission_list = json.loads(permission.permissions) |
365 | | - fields = filter_list(fields, permission_list) |
366 | | - |
| 328 | + fields = get_column_permission_fields(session=session, current_user=current_user, table=table, fields=fields) or fields |
367 | 329 | _list.append(TableAndFields(schema=schema, table=table, fields=fields)) |
368 | 330 | return _list |
369 | 331 |
|
370 | 332 |
|
| 333 | + |
| 334 | + |
371 | 335 | def get_table_schema(session: SessionDep, current_user: CurrentUser, ds: CoreDatasource) -> str: |
372 | 336 | schema_str = "" |
373 | 337 | table_objs = get_table_obj_by_ds(session=session, current_user=current_user, ds=ds) |
@@ -397,16 +361,3 @@ def get_table_schema(session: SessionDep, current_user: CurrentUser, ds: CoreDat |
397 | 361 | schema_str += ",\n".join(field_list) |
398 | 362 | schema_str += '\n]\n' |
399 | 363 | return schema_str |
400 | | - |
401 | | - |
402 | | -def filter_list(list_a, list_b): |
403 | | - id_to_invalid = {} |
404 | | - for b in list_b: |
405 | | - if not b['enable']: |
406 | | - id_to_invalid[b['field_id']] = True |
407 | | - |
408 | | - return [a for a in list_a if not id_to_invalid.get(a.id, False)] |
409 | | - |
410 | | - |
411 | | -def is_normal_user(current_user: CurrentUser): |
412 | | - return current_user.id != 1 |
0 commit comments