feat: 完善模型平台相关功能
This commit is contained in:
@@ -0,0 +1,168 @@
|
||||
"""seed the self-hosted demo users and workspaces
|
||||
|
||||
Revision ID: b71c4f2a9d10
|
||||
Revises: 8d86e2f82860
|
||||
Create Date: 2026-07-31 16:00:00
|
||||
"""
|
||||
|
||||
from collections.abc import Sequence
|
||||
|
||||
from alembic import op
|
||||
import sqlalchemy as sa
|
||||
|
||||
|
||||
revision: str = "b71c4f2a9d10"
|
||||
down_revision: str | Sequence[str] | None = "8d86e2f82860"
|
||||
branch_labels: str | Sequence[str] | None = None
|
||||
depends_on: str | Sequence[str] | None = None
|
||||
|
||||
|
||||
ADMIN_ROLE_ID = "0000000000000000000000000A"
|
||||
DEVELOPER_ROLE_ID = "0000000000000000000000000B"
|
||||
|
||||
USERS = (
|
||||
("0000000000RF6FG1SDBXG59S13", "admin-zhang", "张三", ADMIN_ROLE_ID),
|
||||
("0000000000H2QYCGPCWQM1JSGS", "admin-li", "李四", ADMIN_ROLE_ID),
|
||||
("0000000000RWG40ESZPGJT629J", "dev-wang", "王五", DEVELOPER_ROLE_ID),
|
||||
("00000000004CQV7WASJA6N6FW4", "dev-zhao", "赵六", DEVELOPER_ROLE_ID),
|
||||
)
|
||||
|
||||
WORKSPACES = (
|
||||
("00000000000BM630VT9ARVFZPC", "model-development", "模型开发 Workspace"),
|
||||
("0000000000AE0NC0V5T424KK86", "risk-validation", "风险验证 Workspace"),
|
||||
)
|
||||
|
||||
|
||||
def upgrade() -> None:
|
||||
roles = sa.table(
|
||||
"roles",
|
||||
sa.column("role_id", sa.String),
|
||||
sa.column("role_code", sa.String),
|
||||
sa.column("role_name", sa.String),
|
||||
sa.column("role_scope", sa.String),
|
||||
sa.column("is_builtin", sa.Integer),
|
||||
sa.column("description", sa.String),
|
||||
)
|
||||
users = sa.table(
|
||||
"users",
|
||||
sa.column("user_id", sa.String),
|
||||
sa.column("username", sa.String),
|
||||
sa.column("display_name", sa.String),
|
||||
sa.column("password_hash", sa.String),
|
||||
sa.column("status", sa.String),
|
||||
sa.column("email", sa.String),
|
||||
sa.column("platform_role_id", sa.String),
|
||||
)
|
||||
workspaces = sa.table(
|
||||
"workspaces",
|
||||
sa.column("workspace_id", sa.String),
|
||||
sa.column("workspace_code", sa.String),
|
||||
sa.column("workspace_name", sa.String),
|
||||
sa.column("active_root_uri", sa.String),
|
||||
sa.column("status", sa.String),
|
||||
sa.column("created_by", sa.String),
|
||||
sa.column("description", sa.String),
|
||||
)
|
||||
members = sa.table(
|
||||
"workspace_members",
|
||||
sa.column("workspace_id", sa.String),
|
||||
sa.column("user_id", sa.String),
|
||||
sa.column("role_id", sa.String),
|
||||
sa.column("member_status", sa.String),
|
||||
)
|
||||
|
||||
op.bulk_insert(
|
||||
roles,
|
||||
[
|
||||
{
|
||||
"role_id": ADMIN_ROLE_ID,
|
||||
"role_code": "admin",
|
||||
"role_name": "管理员",
|
||||
"role_scope": "workspace",
|
||||
"is_builtin": 1,
|
||||
"description": "Self-hosted workspace administrator",
|
||||
},
|
||||
{
|
||||
"role_id": DEVELOPER_ROLE_ID,
|
||||
"role_code": "developer",
|
||||
"role_name": "开发人员",
|
||||
"role_scope": "workspace",
|
||||
"is_builtin": 1,
|
||||
"description": "Self-hosted workspace developer",
|
||||
},
|
||||
],
|
||||
)
|
||||
op.bulk_insert(
|
||||
users,
|
||||
[
|
||||
{
|
||||
"user_id": user_id,
|
||||
"username": username,
|
||||
"display_name": display_name,
|
||||
"password_hash": "demo-login-disabled",
|
||||
"status": "active",
|
||||
"email": f"{username}@model-platform.local",
|
||||
"platform_role_id": role_id,
|
||||
}
|
||||
for user_id, username, display_name, role_id in USERS
|
||||
],
|
||||
)
|
||||
op.bulk_insert(
|
||||
workspaces,
|
||||
[
|
||||
{
|
||||
"workspace_id": workspace_id,
|
||||
"workspace_code": workspace_code,
|
||||
"workspace_name": workspace_name,
|
||||
"active_root_uri": f"s3://workspaces/{workspace_id}/",
|
||||
"status": "active",
|
||||
"created_by": USERS[0][0],
|
||||
"description": "Self-hosted demo workspace",
|
||||
}
|
||||
for workspace_id, workspace_code, workspace_name in WORKSPACES
|
||||
],
|
||||
)
|
||||
op.bulk_insert(
|
||||
members,
|
||||
[
|
||||
{
|
||||
"workspace_id": workspace_id,
|
||||
"user_id": user_id,
|
||||
"role_id": role_id,
|
||||
"member_status": "active",
|
||||
}
|
||||
for workspace_id, _, _ in WORKSPACES
|
||||
for user_id, _, _, role_id in USERS
|
||||
],
|
||||
)
|
||||
|
||||
|
||||
def downgrade() -> None:
|
||||
connection = op.get_bind()
|
||||
workspace_ids = [workspace_id for workspace_id, _, _ in WORKSPACES]
|
||||
user_ids = [user_id for user_id, _, _, _ in USERS]
|
||||
connection.execute(
|
||||
sa.text(
|
||||
"DELETE FROM workspace_members "
|
||||
"WHERE workspace_id IN :workspace_ids AND user_id IN :user_ids"
|
||||
).bindparams(
|
||||
sa.bindparam("workspace_ids", expanding=True),
|
||||
sa.bindparam("user_ids", expanding=True),
|
||||
),
|
||||
{"workspace_ids": workspace_ids, "user_ids": user_ids},
|
||||
)
|
||||
connection.execute(
|
||||
sa.text("DELETE FROM workspaces WHERE workspace_id IN :workspace_ids")
|
||||
.bindparams(sa.bindparam("workspace_ids", expanding=True)),
|
||||
{"workspace_ids": workspace_ids},
|
||||
)
|
||||
connection.execute(
|
||||
sa.text("DELETE FROM users WHERE user_id IN :user_ids")
|
||||
.bindparams(sa.bindparam("user_ids", expanding=True)),
|
||||
{"user_ids": user_ids},
|
||||
)
|
||||
connection.execute(
|
||||
sa.text("DELETE FROM roles WHERE role_id IN :role_ids")
|
||||
.bindparams(sa.bindparam("role_ids", expanding=True)),
|
||||
{"role_ids": [ADMIN_ROLE_ID, DEVELOPER_ROLE_ID]},
|
||||
)
|
||||
Reference in New Issue
Block a user