0033_role_upload_permission.py 1.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354
  1. """方案权限矩阵新增「上传」权限(契约1.31):sys_role_permission 加 can_upload 列。
  2. Revision ID: 0033_role_upload_permission
  3. Revises: 0032_user_managed_org
  4. Create Date: 2026-09-13
  5. 变更要点:
  6. 1. sys_role_permission 新增 can_upload 布尔列(默认 0):
  7. - 仅 OWN 行有意义,控制管理员「上传主体方案/批量导入方案」入口
  8. 与 POST /documents 链路;OTHER 行恒 0(服务端校验拒绝置真);
  9. 2. canBindAttachment/canUnbindAttachment 界面合并为单一「挂载」开关、
  10. 两列恒同值,库列保留不变(兼容存量数据渐进收敛);
  11. 3. 升级幂等:加列先探测后执行(与 Flyway V18 并行互不冲突);
  12. 4. 降级直接删列(布尔权限列无存量语义,无有损风险)。
  13. """
  14. from __future__ import annotations
  15. from collections.abc import Sequence
  16. import sqlalchemy as sa
  17. from alembic import op
  18. revision: str = "0033_role_upload_permission"
  19. down_revision: str | None = "0032_user_managed_org"
  20. branch_labels: str | Sequence[str] | None = None
  21. depends_on: str | Sequence[str] | None = None
  22. def _existing_columns() -> set[str]:
  23. inspector = sa.inspect(op.get_bind())
  24. return {
  25. column["name"].lower()
  26. for column in inspector.get_columns("sys_role_permission")
  27. }
  28. def upgrade() -> None:
  29. # sys_role_permission.can_upload 加列(先探测后执行,幂等)
  30. if "can_upload" not in _existing_columns():
  31. op.add_column(
  32. "sys_role_permission",
  33. sa.Column(
  34. "can_upload",
  35. sa.Boolean(),
  36. nullable=False,
  37. server_default=sa.text("0"),
  38. ),
  39. )
  40. def downgrade() -> None:
  41. if "can_upload" in _existing_columns():
  42. op.drop_column("sys_role_permission", "can_upload")