完善审计日志展示与导出权限
This commit is contained in:
@@ -43,6 +43,20 @@ def _role_rank(role: str | None) -> int:
|
||||
return PROJECT_ROLE_RANK.get(role or "", 0)
|
||||
|
||||
|
||||
def _user_audit_name(user, user_id: uuid.UUID) -> str:
|
||||
if user:
|
||||
for attr in ("full_name", "username", "email"):
|
||||
value = getattr(user, attr, None)
|
||||
if value:
|
||||
return str(value)
|
||||
return str(user_id)
|
||||
|
||||
|
||||
async def _member_audit_name(db: AsyncSession, user_id: uuid.UUID) -> str:
|
||||
user = await user_crud.get_by_id(db, user_id)
|
||||
return _user_audit_name(user, user_id)
|
||||
|
||||
|
||||
async def _ensure_member_mutation_allowed(
|
||||
db: AsyncSession,
|
||||
study_id: uuid.UUID,
|
||||
@@ -116,7 +130,7 @@ async def add_member(
|
||||
entity_id=updated.id,
|
||||
action="PROJECT_MEMBER_UPDATED",
|
||||
detail=json.dumps({
|
||||
"targetName": str(updated.user_id),
|
||||
"targetName": await _member_audit_name(db, updated.user_id),
|
||||
"before": {"is_active": existing.is_active, "role_in_study": existing.role_in_study},
|
||||
"after": {"is_active": updated.is_active, "role_in_study": updated.role_in_study},
|
||||
}, ensure_ascii=False),
|
||||
@@ -132,7 +146,10 @@ async def add_member(
|
||||
entity_type="study_member",
|
||||
entity_id=member.id,
|
||||
action="PROJECT_MEMBER_ADDED",
|
||||
detail=json.dumps({"targetName": str(member.user_id), "after": {"role_in_study": member.role_in_study, "is_active": member.is_active}}, ensure_ascii=False),
|
||||
detail=json.dumps({
|
||||
"targetName": await _member_audit_name(db, member.user_id),
|
||||
"after": {"role_in_study": member.role_in_study, "is_active": member.is_active},
|
||||
}, ensure_ascii=False),
|
||||
operator_id=current_user.id,
|
||||
operator_role=await _operator_project_role(db, study_id, current_user),
|
||||
)
|
||||
@@ -247,7 +264,11 @@ async def update_member(
|
||||
entity_type="study_member",
|
||||
entity_id=updated.id,
|
||||
action="PROJECT_MEMBER_UPDATED",
|
||||
detail=json.dumps({"targetName": str(updated.user_id), "before": before_data, "after": after_data}, ensure_ascii=False),
|
||||
detail=json.dumps({
|
||||
"targetName": await _member_audit_name(db, updated.user_id),
|
||||
"before": before_data,
|
||||
"after": after_data,
|
||||
}, ensure_ascii=False),
|
||||
operator_id=current_user.id,
|
||||
operator_role=await _operator_project_role(db, study_id, current_user),
|
||||
)
|
||||
@@ -288,7 +309,11 @@ async def remove_member(
|
||||
entity_type="study_member",
|
||||
entity_id=removed.id,
|
||||
action="PROJECT_MEMBER_REMOVED",
|
||||
detail=json.dumps({"targetName": str(removed.user_id), "before": before_data, "after": {"is_active": removed.is_active}}, ensure_ascii=False),
|
||||
detail=json.dumps({
|
||||
"targetName": _user_audit_name(target_user, removed.user_id),
|
||||
"before": before_data,
|
||||
"after": {"is_active": removed.is_active},
|
||||
}, ensure_ascii=False),
|
||||
operator_id=current_user.id,
|
||||
operator_role=await _operator_project_role(db, study_id, current_user),
|
||||
)
|
||||
|
||||
Reference in New Issue
Block a user