"""角色编辑管理位(契约1.25):sys_role 新增 manage_role_edit。 Revision ID: 0030_role_edit_permission Revises: 0029_system_management Create Date: 2026-09-10 变更要点: 1. sys_role 新增 manage_role_edit 布尔管理位(默认 0,与 manage_category_edit 等同列族;内置 admin 账号恒有,不受开关约束); 2. 角色为全局对象,本管理位不受管理范围锚点约束(同分类编辑); 3. 升级幂等:加列先探测,可重复跑;与 Flyway V15 并行执行互不冲突。 """ from __future__ import annotations from collections.abc import Sequence import sqlalchemy as sa from alembic import op revision: str = "0030_role_edit_permission" down_revision: str | None = "0029_system_management" branch_labels: str | Sequence[str] | None = None depends_on: str | Sequence[str] | None = None ROLE_MANAGE_COLUMNS = ("manage_role_edit",) def _existing_role_columns() -> set[str]: inspector = sa.inspect(op.get_bind()) return { column["name"].lower() for column in inspector.get_columns("sys_role") } def upgrade() -> None: existing_columns = _existing_role_columns() for column in ROLE_MANAGE_COLUMNS: if column not in existing_columns: op.add_column( "sys_role", sa.Column( column, sa.Boolean(), nullable=False, server_default=sa.text("0"), ), ) def downgrade() -> None: existing_columns = _existing_role_columns() for column in ROLE_MANAGE_COLUMNS: if column in existing_columns: op.drop_column("sys_role", column)