0039_attachment_permissions_lock_merge.py 2.1 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162
  1. """sys_role_permission 附件四权限列与方案锁挂载位合并(契约1.41)。
  2. Revision ID: 0039_attachment_permissions_lock_merge
  3. Revises: 0038_session_jti
  4. Create Date: 2026-09-18
  5. 变更要点(仅库结构同步,Python 版已废弃不做功能实现):
  6. 1. sys_role_permission 加 4 列:can_attachment_view / can_attachment_download /
  7. can_attachment_edit / can_attachment_upload——附件权限独立于主案权限,
  8. 不跟随挂载主案权限;仅 OWN 行有意义(OTHER 行服务端拒绝置真);
  9. 2. doc_document 方案锁「挂载/解除挂载」合并为单一「挂载」保护位:存量
  10. protect_unbind_attachment=1 并入 protect_bind_attachment(列保留);
  11. 3. 双引擎幂等:先探测列存在再加(MySQL 与达梦升级互不冲突)。
  12. """
  13. from __future__ import annotations
  14. from collections.abc import Sequence
  15. import sqlalchemy as sa
  16. from alembic import op
  17. revision: str = "0039_attachment_permissions_lock_merge"
  18. down_revision: str | None = "0038_session_jti"
  19. branch_labels: str | Sequence[str] | None = None
  20. depends_on: str | Sequence[str] | None = None
  21. _ATTACHMENT_COLUMNS = (
  22. "can_attachment_view",
  23. "can_attachment_download",
  24. "can_attachment_edit",
  25. "can_attachment_upload",
  26. )
  27. def _column_exists(table: str, column: str) -> bool:
  28. # 达梦 inspector 返回大写名,统一小写比较
  29. inspector = sa.inspect(op.get_bind())
  30. return column.lower() in {
  31. name.lower() for name in inspector.get_columns(table)
  32. }
  33. def upgrade() -> None:
  34. for column in _ATTACHMENT_COLUMNS:
  35. if _column_exists("sys_role_permission", column):
  36. continue
  37. op.add_column(
  38. "sys_role_permission",
  39. sa.Column(column, sa.Boolean(), nullable=False, server_default=sa.false()),
  40. )
  41. op.execute(
  42. "UPDATE doc_document SET protect_bind_attachment = 1 "
  43. "WHERE protect_unbind_attachment = 1 AND protect_bind_attachment = 0"
  44. )
  45. def downgrade() -> None:
  46. for column in reversed(_ATTACHMENT_COLUMNS):
  47. if not _column_exists("sys_role_permission", column):
  48. continue
  49. op.drop_column("sys_role_permission", column)