Files

153 lines
4.8 KiB
Python
Raw Permalink Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
#!/usr/bin/env python3
"""
为用户分配角色
运行方式:
cd backend
python scripts/assign_role.py <employee_id> <role_name>
示例:
python scripts/assign_role.py zhangsan agent
python scripts/assign_role.py lisi admin
"""
import sys
import os
import uuid
from datetime import datetime
# 添加 backend 目录到 Python 路径
sys.path.insert(0, os.path.dirname(os.path.dirname(os.path.abspath(__file__))))
from sqlalchemy import create_engine, select
from sqlalchemy.orm import Session
from app.config import settings
from app.models import Role, UserRole
def assign_role(employee_id: str, role_name: str):
"""为指定用户分配角色"""
# 本地开发使用 aiosqlite 异步驱动,脚本是同步的,需要替换
db_url = settings.database_url.replace("sqlite+aiosqlite://", "sqlite://")
engine = create_engine(db_url)
with Session(engine) as session:
# 1. 查找角色
role = session.execute(select(Role).where(Role.name == role_name)).scalars().first()
if not role:
print(f"[FAIL] 角色 '{role_name}' 不存在")
print("可用角色: user, agent, admin")
return False
# 2. 检查是否已有该角色
existing = session.execute(
select(UserRole).where(
UserRole.employee_id == employee_id,
UserRole.role_id == role.id,
)
).scalars().first()
if existing:
print(f"[WARN] 用户 {employee_id} 已拥有角色 {role_name}")
return True
# 3. 分配角色
user_role = UserRole(
id=str(uuid.uuid4()),
employee_id=employee_id,
role_id=role.id,
source="manual", # 手动分配
assigned_at=datetime.now(),
)
session.add(user_role)
session.commit()
print(f"[OK] 已为用户 {employee_id} 分配角色 {role.display_name} ({role_name})")
return True
def remove_role(employee_id: str, role_name: str):
"""移除用户的指定角色"""
db_url = settings.database_url.replace("sqlite+aiosqlite://", "sqlite://")
engine = create_engine(db_url)
with Session(engine) as session:
# 查找角色
role = session.execute(select(Role).where(Role.name == role_name)).scalars().first()
if not role:
print(f"[FAIL] 角色 '{role_name}' 不存在")
return False
# 查找用户角色关联
user_role = session.execute(
select(UserRole).where(
UserRole.employee_id == employee_id,
UserRole.role_id == role.id,
)
).scalars().first()
if not user_role:
print(f"[WARN] 用户 {employee_id} 未拥有角色 {role_name}")
return True
# 移除角色
session.delete(user_role)
session.commit()
print(f"[OK] 已移除用户 {employee_id} 的角色 {role.display_name} ({role_name})")
return True
def list_user_roles(employee_id: str):
"""列出用户的所有角色"""
db_url = settings.database_url.replace("sqlite+aiosqlite://", "sqlite://")
engine = create_engine(db_url)
with Session(engine) as session:
# 查询用户的所有角色
user_roles = session.execute(
select(UserRole, Role)
.join(Role, UserRole.role_id == Role.id)
.where(UserRole.employee_id == employee_id)
).all()
if not user_roles:
print(f"用户 {employee_id} 暂无分配角色(默认为 user")
return
print(f"用户 {employee_id} 的角色列表:")
for user_role, role in user_roles:
print(f" - {role.name}: {role.display_name} (分配方式: {user_role.source})")
if __name__ == "__main__":
if len(sys.argv) < 2:
print("用法:")
print(" 分配角色: python assign_role.py <employee_id> <role_name>")
print(" 移除角色: python assign_role.py <employee_id> <role_name> --remove")
print(" 查看角色: python assign_role.py <employee_id> --list")
print("")
print("示例:")
print(" python assign_role.py zhangsan agent")
print(" python assign_role.py lisi admin")
print(" python assign_role.py zhangsan --list")
sys.exit(1)
employee_id = sys.argv[1]
if "--list" in sys.argv:
list_user_roles(employee_id)
elif "--remove" in sys.argv and len(sys.argv) >= 4:
role_name = sys.argv[2]
remove_role(employee_id, role_name)
elif len(sys.argv) >= 3 and not sys.argv[2].startswith("--"):
role_name = sys.argv[2]
assign_role(employee_id, role_name)
else:
print("[FAIL] 参数错误,请查看用法")
sys.exit(1)