0043_password_reset_request.py 2.4 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758
  1. """登录界面重置密码审批流(契约1.49)。
  2. Revision ID: 0043_password_reset_request
  3. Revises: 0042_matrix_top_category_kind
  4. Create Date: 2026-09-22
  5. 变更要点(Python 版已废弃不做功能实现,仅保持迁移链同步):
  6. 1. 新建 sys_password_reset_request 重置密码申请单表:登录前自助提交,
  7. 按申请用户类型路由审批角色(首长→安全管理员、其他→系统管理员),
  8. 任一审批人处理即定(先到先得);
  9. 2. 审批通过=回首次登录态(密码清空、门户重新设密),由服务层执行。
  10. """
  11. from __future__ import annotations
  12. from collections.abc import Sequence
  13. import sqlalchemy as sa
  14. from alembic import op
  15. revision: str = "0043_password_reset_request"
  16. down_revision: str | None = "0042_matrix_top_category_kind"
  17. branch_labels: str | Sequence[str] | None = None
  18. depends_on: str | Sequence[str] | None = None
  19. def upgrade() -> None:
  20. op.create_table(
  21. "sys_password_reset_request",
  22. sa.Column("id", sa.BigInteger(), autoincrement=True, nullable=False),
  23. sa.Column("user_id", sa.BigInteger(), nullable=False),
  24. sa.Column("username", sa.String(length=64), nullable=False),
  25. sa.Column("real_name", sa.String(length=100), nullable=False),
  26. sa.Column("user_type", sa.String(length=16), nullable=False),
  27. sa.Column("approver_role_name", sa.String(length=64), nullable=False),
  28. sa.Column("status", sa.String(length=16), nullable=False),
  29. sa.Column("request_ip", sa.String(length=64), nullable=True),
  30. sa.Column("requested_at", sa.DateTime(), nullable=False),
  31. sa.Column("handled_by", sa.BigInteger(), nullable=True),
  32. sa.Column("handled_by_name", sa.String(length=100), nullable=True),
  33. sa.Column("handled_at", sa.DateTime(), nullable=True),
  34. sa.Column("created_at", sa.DateTime(), nullable=False,
  35. server_default=sa.text("CURRENT_TIMESTAMP")),
  36. sa.PrimaryKeyConstraint("id"),
  37. sa.CheckConstraint(
  38. "status IN ('PENDING', 'APPROVED', 'REJECTED')",
  39. name="ck_password_reset_request_status"),
  40. )
  41. op.create_index(
  42. "ix_password_reset_request_user",
  43. "sys_password_reset_request",
  44. ["user_id", "status"])
  45. def downgrade() -> None:
  46. op.drop_index("ix_password_reset_request_user",
  47. table_name="sys_password_reset_request")
  48. op.drop_table("sys_password_reset_request")