|
|
@@ -167,6 +167,13 @@ def set_user_post_ids_only(
|
|
|
def list_user_ids_bound_to_post(db: Session, post_id: str, tenant_no: str) -> List[str]:
|
|
|
rows = (
|
|
|
db.query(SysUserPost.user_id)
|
|
|
+ .join(
|
|
|
+ SysUser,
|
|
|
+ and_(
|
|
|
+ SysUser.id == SysUserPost.user_id,
|
|
|
+ SysUser.del_flag == 0,
|
|
|
+ ),
|
|
|
+ )
|
|
|
.filter(
|
|
|
and_(
|
|
|
SysUserPost.post_id == post_id,
|
|
|
@@ -250,6 +257,12 @@ def sync_post_user_bindings(
|
|
|
|
|
|
|
|
|
def get_user_with_relations(db: Session, user_id: str) -> Optional[Dict[str, Any]]:
|
|
|
+ from app.services.web_auth_roles import (
|
|
|
+ get_effective_role_ids,
|
|
|
+ get_post_inherited_role_ids,
|
|
|
+ get_role_names_by_ids,
|
|
|
+ )
|
|
|
+
|
|
|
u = get_user(db, user_id)
|
|
|
if not u:
|
|
|
return None
|
|
|
@@ -269,8 +282,13 @@ def get_user_with_relations(db: Session, user_id: str) -> Optional[Dict[str, Any
|
|
|
.all()
|
|
|
]
|
|
|
post_ids = list_post_ids_for_user(db, user_id)
|
|
|
+ effective_role_ids = get_effective_role_ids(db, user_id)
|
|
|
+ post_inherited_role_ids = get_post_inherited_role_ids(db, user_id)
|
|
|
d["roleIds"] = role_ids
|
|
|
d["postIds"] = post_ids
|
|
|
+ d["postInheritedRoleIds"] = post_inherited_role_ids
|
|
|
+ d["effectiveRoleIds"] = effective_role_ids
|
|
|
+ d["effectiveRoleNames"] = get_role_names_by_ids(db, effective_role_ids)
|
|
|
return d
|
|
|
|
|
|
|
|
|
@@ -291,16 +309,15 @@ def _replace_associations(
|
|
|
role_ids: Optional[List[str]] = None,
|
|
|
post_ids: Optional[List[str]] = None,
|
|
|
) -> None:
|
|
|
+ """全量替换关联。仅当对应参数不为 None 时才替换该侧(避免只改职位时清空直接角色)。"""
|
|
|
now = datetime.now()
|
|
|
- db.query(SysUserRole).filter(
|
|
|
- and_(SysUserRole.user_id == user_id, SysUserRole.del_flag == 0)
|
|
|
- ).update({"del_flag": 1, "update_time": now})
|
|
|
- db.query(SysUserPost).filter(
|
|
|
- and_(SysUserPost.user_id == user_id, SysUserPost.del_flag == 0)
|
|
|
- ).update({"del_flag": 1, "update_time": now})
|
|
|
-
|
|
|
- if role_ids:
|
|
|
+ if role_ids is not None:
|
|
|
+ db.query(SysUserRole).filter(
|
|
|
+ and_(SysUserRole.user_id == user_id, SysUserRole.del_flag == 0)
|
|
|
+ ).update({"del_flag": 1, "update_time": now})
|
|
|
for rid in role_ids:
|
|
|
+ if not rid:
|
|
|
+ continue
|
|
|
db.add(SysUserRole(
|
|
|
id=generate_uuid(),
|
|
|
user_id=user_id,
|
|
|
@@ -316,8 +333,13 @@ def _replace_associations(
|
|
|
del_flag=0,
|
|
|
))
|
|
|
|
|
|
- if post_ids:
|
|
|
+ if post_ids is not None:
|
|
|
+ db.query(SysUserPost).filter(
|
|
|
+ and_(SysUserPost.user_id == user_id, SysUserPost.del_flag == 0)
|
|
|
+ ).update({"del_flag": 1, "update_time": now})
|
|
|
for pid in post_ids:
|
|
|
+ if not pid:
|
|
|
+ continue
|
|
|
db.add(SysUserPost(
|
|
|
id=generate_uuid(),
|
|
|
user_id=user_id,
|