|
5 | 5 | from fastapi import HTTPException |
6 | 6 | from sqlalchemy import and_, text, cast, or_, func |
7 | 7 | from sqlalchemy.dialects.postgresql import JSONB |
8 | | -from sqlbot_xpack.permissions.models.ds_permission import DsPermission |
| 8 | +from sqlbot_xpack.permissions.api.permission import transRecord2DTO |
| 9 | +from sqlbot_xpack.permissions.models.ds_permission import DsPermission, PermissionDTO |
9 | 10 | from sqlbot_xpack.permissions.models.ds_rules import DsRules |
10 | 11 | from sqlmodel import select |
11 | 12 |
|
| 13 | +from apps.datasource.crud.row_permission import transFilterTree |
12 | 14 | from apps.datasource.utils.utils import aes_decrypt |
13 | 15 | from apps.db.constant import DB |
14 | 16 | from apps.db.db import get_engine, get_tables, get_fields, exec_sql |
@@ -238,43 +240,69 @@ def updateField(session: SessionDep, field: CoreField): |
238 | 240 |
|
239 | 241 |
|
240 | 242 | def preview(session: SessionDep, current_user: CurrentUser, id: int, data: TableObj): |
| 243 | + ds = session.query(CoreDatasource).filter(CoreDatasource.id == id).first() |
| 244 | + check_status(session, ds, True) |
| 245 | + |
241 | 246 | if data.fields is None or len(data.fields) == 0: |
242 | 247 | return {"fields": [], "data": [], "sql": ''} |
243 | 248 |
|
244 | | - # column is checked, and, column permission for data.fields |
| 249 | + where = None |
245 | 250 | f_list = [f for f in data.fields if f.checked] |
246 | | - column_permissions = session.query(DsPermission).filter( |
247 | | - and_(DsPermission.table_id == data.table.id, DsPermission.type == 'column')).all() |
248 | | - if column_permissions is not None: |
249 | | - for permission in column_permissions: |
250 | | - # check permission and user in same rules |
251 | | - obj = session.query(DsRules).filter( |
252 | | - and_(DsRules.permission_list.op('@>')(cast([permission.id], JSONB)), |
253 | | - or_(DsRules.user_list.op('@>')(cast([f'{current_user.id}'], JSONB)), |
254 | | - DsRules.user_list.op('@>')(cast([current_user.id], JSONB)))) |
255 | | - ).first() |
256 | | - if obj is not None: |
257 | | - permission_list = json.loads(permission.permissions) |
258 | | - f_list = filter_list(f_list, permission_list) |
| 251 | + if is_normal_user(current_user): |
| 252 | + # column is checked, and, column permission for data.fields |
| 253 | + column_permissions = session.query(DsPermission).filter( |
| 254 | + and_(DsPermission.table_id == data.table.id, DsPermission.type == 'column')).all() |
| 255 | + if column_permissions is not None: |
| 256 | + for permission in column_permissions: |
| 257 | + # check permission and user in same rules |
| 258 | + obj = session.query(DsRules).filter( |
| 259 | + and_(DsRules.permission_list.op('@>')(cast([permission.id], JSONB)), |
| 260 | + or_(DsRules.user_list.op('@>')(cast([f'{current_user.id}'], JSONB)), |
| 261 | + DsRules.user_list.op('@>')(cast([current_user.id], JSONB)))) |
| 262 | + ).first() |
| 263 | + if obj is not None: |
| 264 | + permission_list = json.loads(permission.permissions) |
| 265 | + f_list = filter_list(f_list, permission_list) |
| 266 | + |
| 267 | + # row permission tree |
| 268 | + row_permissions = session.query(DsPermission).filter( |
| 269 | + and_(DsPermission.table_id == data.table.id, DsPermission.type == 'row')).all() |
| 270 | + res: List[PermissionDTO] = [] |
| 271 | + if row_permissions is not None: |
| 272 | + for permission in row_permissions: |
| 273 | + # check permission and user in same rules |
| 274 | + obj = session.query(DsRules).filter( |
| 275 | + and_(DsRules.permission_list.op('@>')(cast([permission.id], JSONB)), |
| 276 | + or_(DsRules.user_list.op('@>')(cast([f'{current_user.id}'], JSONB)), |
| 277 | + DsRules.user_list.op('@>')(cast([current_user.id], JSONB)))) |
| 278 | + ).first() |
| 279 | + if obj is not None: |
| 280 | + res.append(transRecord2DTO(session, permission)) |
| 281 | + wheres = transFilterTree(session, res, ds) |
| 282 | + where = (' where ' + wheres) if wheres is not None and wheres != '' else '' |
259 | 283 |
|
260 | 284 | fields = [f.field_name for f in f_list] |
261 | 285 | if fields is None or len(fields) == 0: |
262 | 286 | return {"fields": [], "data": [], "sql": ''} |
263 | 287 |
|
264 | | - ds = session.query(CoreDatasource).filter(CoreDatasource.id == id).first() |
265 | | - check_status(session, ds, True) |
266 | 288 | conf = DatasourceConf(**json.loads(aes_decrypt(ds.configuration))) if ds.type != "excel" else get_engine_config() |
267 | 289 | sql: str = "" |
268 | 290 | if ds.type == "mysql": |
269 | | - sql = f"""SELECT `{"`, `".join(fields)}` FROM `{data.table.table_name}` LIMIT 100""" |
| 291 | + sql = f"""SELECT `{"`, `".join(fields)}` FROM `{data.table.table_name}` |
| 292 | + {where} |
| 293 | + LIMIT 100""" |
270 | 294 | elif ds.type == "sqlServer": |
271 | 295 | sql = f"""SELECT [{"], [".join(fields)}] FROM [{conf.dbSchema}].[{data.table.table_name}] |
| 296 | + {where} |
272 | 297 | ORDER BY [{data.fields[0].field_name}] |
273 | 298 | OFFSET 0 ROWS FETCH NEXT 100 ROWS ONLY""" |
274 | 299 | elif ds.type == "pg" or ds.type == "excel": |
275 | | - sql = f"""SELECT "{'", "'.join(fields)}" FROM "{conf.dbSchema}"."{data.table.table_name}" LIMIT 100""" |
| 300 | + sql = f"""SELECT "{'", "'.join(fields)}" FROM "{conf.dbSchema}"."{data.table.table_name}" |
| 301 | + {where} |
| 302 | + LIMIT 100""" |
276 | 303 | elif ds.type == "oracle": |
277 | 304 | sql = f"""SELECT "{'", "'.join(fields)}" FROM "{conf.dbSchema}"."{data.table.table_name}" |
| 305 | + {where} |
278 | 306 | ORDER BY "{data.fields[0].field_name}" |
279 | 307 | OFFSET 0 ROWS FETCH NEXT 100 ROWS ONLY""" |
280 | 308 | return exec_sql(ds, sql) |
@@ -320,19 +348,20 @@ def get_table_obj_by_ds(session: SessionDep, current_user: CurrentUser, ds: Core |
320 | 348 | fields = session.query(CoreField).filter(and_(CoreField.table_id == table.id, CoreField.checked == True)).all() |
321 | 349 |
|
322 | 350 | # do column permissions, filter fields |
323 | | - column_permissions = session.query(DsPermission).filter( |
324 | | - and_(DsPermission.table_id == table.id, DsPermission.type == 'column')).all() |
325 | | - if column_permissions is not None: |
326 | | - for permission in column_permissions: |
327 | | - # check permission and user in same rules |
328 | | - obj = session.query(DsRules).filter( |
329 | | - and_(DsRules.permission_list.op('@>')(cast([permission.id], JSONB)), |
330 | | - or_(DsRules.user_list.op('@>')(cast([f'{current_user.id}'], JSONB)), |
331 | | - DsRules.user_list.op('@>')(cast([current_user.id], JSONB)))) |
332 | | - ).first() |
333 | | - if obj is not None: |
334 | | - permission_list = json.loads(permission.permissions) |
335 | | - fields = filter_list(fields, permission_list) |
| 351 | + if is_normal_user(current_user): |
| 352 | + column_permissions = session.query(DsPermission).filter( |
| 353 | + and_(DsPermission.table_id == table.id, DsPermission.type == 'column')).all() |
| 354 | + if column_permissions is not None: |
| 355 | + for permission in column_permissions: |
| 356 | + # check permission and user in same rules |
| 357 | + obj = session.query(DsRules).filter( |
| 358 | + and_(DsRules.permission_list.op('@>')(cast([permission.id], JSONB)), |
| 359 | + or_(DsRules.user_list.op('@>')(cast([f'{current_user.id}'], JSONB)), |
| 360 | + DsRules.user_list.op('@>')(cast([current_user.id], JSONB)))) |
| 361 | + ).first() |
| 362 | + if obj is not None: |
| 363 | + permission_list = json.loads(permission.permissions) |
| 364 | + fields = filter_list(fields, permission_list) |
336 | 365 |
|
337 | 366 | _list.append(TableAndFields(schema=schema, table=table, fields=fields)) |
338 | 367 | return _list |
@@ -376,3 +405,7 @@ def filter_list(list_a, list_b): |
376 | 405 | id_to_invalid[b['field_id']] = True |
377 | 406 |
|
378 | 407 | return [a for a in list_a if not id_to_invalid.get(a.id, False)] |
| 408 | + |
| 409 | + |
| 410 | +def is_normal_user(current_user: CurrentUser): |
| 411 | + return current_user.id != 1 and (current_user.weight is not None and current_user.weight != 1) |
0 commit comments