"""admin_user 加 pages_override 列(「自定义」权限:按人存专属可见页 key 列表) 权限管理页新增「自定义」角色:选它时该成员的可见页不跟随任何共享角色,而由逐页勾选决定, 存这个人专属的一份页 key 列表。仅 role == "custom" 时有效;普通角色为 None(可见页跟随角色)。 PG 用 JSONB,SQLite 退化为通用 JSON(同 admin_audit_log.detail / comparison_record.raw_payload)。 Revision ID: admin_user_pages_override Revises: admin_user_plain_password Create Date: 2026-07-08 00:00:00.000000 """ from collections.abc import Sequence import sqlalchemy as sa from sqlalchemy.dialects.postgresql import JSONB from alembic import op revision: str = "admin_user_pages_override" down_revision: str | Sequence[str] | None = "admin_user_plain_password" branch_labels: str | Sequence[str] | None = None depends_on: str | Sequence[str] | None = None # 与 app/models/admin.py 的 _JSON 一致:PG JSONB / 其它 JSON _JSON = sa.JSON().with_variant(JSONB(), "postgresql") def upgrade() -> None: with op.batch_alter_table("admin_user", schema=None) as batch_op: batch_op.add_column(sa.Column("pages_override", _JSON, nullable=True)) def downgrade() -> None: with op.batch_alter_table("admin_user", schema=None) as batch_op: batch_op.drop_column("pages_override")