Skip to content

Commit e5fd7d2

Browse files
committed
fix: package error
1 parent ec7cee1 commit e5fd7d2

File tree

1 file changed

+66
-48
lines changed

1 file changed

+66
-48
lines changed

backend/common/audit/schemas/logger_decorator.py

Lines changed: 66 additions & 48 deletions
Original file line numberDiff line numberDiff line change
@@ -2,14 +2,14 @@
22
import functools
33
import json
44
import inspect
5-
from typing import Callable, Any, Optional, Dict, Union
5+
from typing import Callable, Any, Optional, Dict, Union, List
66
from fastapi import Request, HTTPException
77
from datetime import datetime
88
from pydantic import BaseModel
99
from sqlmodel import Session, select
1010
import traceback
1111
from sqlbot_xpack.audit.curd.audit import build_resource_union_query
12-
from common.audit.models.log_model import OperationType, OperationStatus, SystemLog
12+
from common.audit.models.log_model import OperationType, OperationStatus, SystemLog, SystemLogsResource
1313
from common.audit.schemas.request_context import RequestContext
1414
from apps.system.crud.user import get_user_by_account
1515
from apps.system.schemas.system_schema import UserInfoDTO, BaseUserDTO
@@ -18,42 +18,36 @@
1818
from common.core.db import engine
1919

2020

21-
22-
def get_resource_name_by_id_and_module(session, resource_id: Any, module: str) -> Optional[str]:
21+
def get_resource_name_by_id_and_module(session, resource_id: Any, module: str) -> List[Dict[str, str]]:
2322
resource_union_query = build_resource_union_query()
2423
resource_alias = resource_union_query.alias("resource")
2524

26-
if isinstance(resource_id, list):
27-
# 处理列表情况
28-
if not resource_id:
29-
return None
30-
31-
# 构建查询,使用 IN 条件
32-
query = select(
33-
resource_alias.c.name
34-
).where(
35-
and_(
36-
resource_alias.c.id.in_([str(id_) for id_ in resource_id]),
37-
resource_alias.c.module == module
38-
)
25+
# 统一处理为列表
26+
if not isinstance(resource_id, list):
27+
resource_id = [resource_id]
28+
29+
if not resource_id:
30+
return []
31+
32+
# 构建查询,使用 IN 条件
33+
query = select(
34+
resource_alias.c.id,
35+
resource_alias.c.name,
36+
resource_alias.c.module
37+
).where(
38+
and_(
39+
resource_alias.c.id.in_([str(id_) for id_ in resource_id]),
40+
resource_alias.c.module == module
3941
)
40-
# 执行查询并获取所有结果
41-
results = session.execute(query).scalars().all()
42-
43-
# 用逗号连接所有名称
44-
return ",".join(results) if results else None
45-
else:
46-
# 处理单个字符串情况
47-
query = select(
48-
resource_alias.c.name
49-
).where(
50-
and_(
51-
resource_alias.c.id == str(resource_id),
52-
resource_alias.c.module == module
53-
)
54-
)
55-
return session.execute(query).scalar()
42+
)
5643

44+
results = session.execute(query).fetchall()
45+
46+
return [{
47+
'resource_id': str(row.id),
48+
'resource_name': row.name or '',
49+
'module': row.module or ''
50+
} for row in results]
5751

5852
class LogConfig(BaseModel):
5953
operation_type: OperationType
@@ -390,6 +384,7 @@ async def create_log_record(
390384
remark: Optional[str] = None,
391385
oid: int = -1,
392386
opt_type_ref : OperationType = None,
387+
resource_info_list : Optional[List] = None,
393388
) -> Optional[SystemLog]:
394389
"""Create log records"""
395390
try:
@@ -422,21 +417,46 @@ async def create_log_record(
422417
error_message=error_message,
423418
module=config.module,
424419
resource_id=str(resource_id),
425-
resource_name=str(resource_name),
426420
request_method=request.method if request else None,
427421
request_path=request.url.path if request else None,
428422
request_params=request_params,
429423
create_time=datetime.now(),
430424
remark=remark
431425
)
432426

427+
433428
with Session(engine) as session:
434429
session.add(log)
435-
session.query(SystemLog).filter(SystemLog.resource_id == str(resource_id)).update({
436-
SystemLog.resource_name: str(resource_name)
437-
}, synchronize_session='fetch')
438430
session.commit()
439431
session.refresh(log)
432+
# 统一处理不同类型的 resource_id_info
433+
if isinstance(resource_id, list):
434+
resource_ids = [str(rid) for rid in resource_id]
435+
else:
436+
resource_ids = [str(resource_id)]
437+
# 批量添加 SystemLogsResource
438+
resource_entries = []
439+
for resource_id_details in resource_ids:
440+
resource_entry = SystemLogsResource(
441+
resource_id=resource_id_details,
442+
log_id=log.id,
443+
module=config.module
444+
)
445+
resource_entries.append(resource_entry)
446+
if resource_entries:
447+
session.bulk_save_objects(resource_entries)
448+
session.commit()
449+
450+
if config.operation_type == OperationType.DELETE and resource_info_list is not None:
451+
# 批量更新 SystemLogsResource 表的 resource_name
452+
for resource_info in resource_info_list:
453+
session.query(SystemLogsResource).filter(
454+
SystemLogsResource.resource_id == resource_info['resource_id'],
455+
SystemLogsResource.module == resource_info['module'],
456+
).update({
457+
SystemLogsResource.resource_name: resource_info['resource_name']
458+
}, synchronize_session='fetch')
459+
session.commit()
440460
return log
441461

442462
except Exception as e:
@@ -472,6 +492,8 @@ async def async_wrapper(*args, **kwargs):
472492
remark = None
473493
oid = -1
474494
opt_type_ref = None
495+
resource_info_list = None
496+
result = None
475497

476498
try:
477499
# Get current request
@@ -515,7 +537,7 @@ async def async_wrapper(*args, **kwargs):
515537
resource_name = input_account
516538
if config.operation_type == OperationType.DELETE:
517539
with Session(engine) as session:
518-
resource_name = get_resource_name_by_id_and_module(session, resource_id, config.module)
540+
resource_info_list = get_resource_name_by_id_and_module(session, resource_id, config.module)
519541

520542
if config.operation_type == OperationType.CREATE_OR_UPDATE:
521543
opt_type_ref = OperationType.UPDATE if resource_id is not None else OperationType.CREATE
@@ -530,9 +552,6 @@ async def async_wrapper(*args, **kwargs):
530552
result,
531553
"result"
532554
)
533-
if config.operation_type != OperationType.DELETE:
534-
with Session(engine) as session:
535-
resource_name = get_resource_name_by_id_and_module(session, resource_id, config.module)
536555
return result
537556

538557
except Exception as e:
@@ -568,7 +587,8 @@ async def async_wrapper(*args, **kwargs):
568587
remark=remark,
569588
request=request,
570589
oid=oid,
571-
opt_type_ref=opt_type_ref
590+
opt_type_ref=opt_type_ref,
591+
resource_info_list=resource_info_list
572592
)
573593
except Exception as log_error:
574594
print(f"[SystemLogger] Log creation failed: {log_error}")
@@ -581,6 +601,7 @@ def sync_wrapper(*args, **kwargs):
581601
request = None
582602
resource_id = None
583603
resource_name = None
604+
resource_info_list = None
584605
result = None
585606

586607
try:
@@ -602,7 +623,7 @@ def sync_wrapper(*args, **kwargs):
602623
# Obtain client information
603624
if config.operation_type == OperationType.DELETE:
604625
with Session(engine) as session:
605-
resource_name = get_resource_name_by_id_and_module(session, resource_id, config.module)
626+
resource_info_list = get_resource_name_by_id_and_module(session, resource_id, config.module)
606627

607628
# Execute the original function
608629
result = func(*args, **kwargs)
@@ -615,10 +636,6 @@ def sync_wrapper(*args, **kwargs):
615636
"result"
616637
)
617638

618-
if config.operation_type != OperationType.DELETE:
619-
with Session(engine) as session:
620-
resource_name = get_resource_name_by_id_and_module(session, resource_id, config.module)
621-
622639
return result
623640

624641
except Exception as e:
@@ -652,7 +669,8 @@ def sync_wrapper(*args, **kwargs):
652669
error_message=error_message,
653670
resource_id=resource_id,
654671
resource_name=resource_name,
655-
request=request
672+
request=request,
673+
resource_info_list=resource_info_list
656674
)
657675
)
658676
else:

0 commit comments

Comments
 (0)