7e17df4130
## 改动内容 - 拆分邀请提现与其他提现的筛选、统计和详情数据口径 - 增加人工高风险标识、备注、权限和数据库迁移 - 完善微信失败原因查单、退款兜底与审核操作 - 移除人工处理超时订单接口和提现账本校验功能 - 补充提现审核、邀请详情、风险操作与微信失败原因回归测试 ## 验证 - 相关后端测试:82 passed - Ruff F/I:通过 - 新数据库迁移 upgrade/downgrade/upgrade:通过 ## 说明 - 本地 seed mock 脚本未提交 --------- Co-authored-by: guke <guke@wonderable.ai> Co-authored-by: unknown <798648091@qq.com> Reviewed-on: #175 Co-authored-by: linkeyu <linkeyu@wonderable.ai> Co-committed-by: linkeyu <linkeyu@wonderable.ai>
77 lines
2.2 KiB
Python
77 lines
2.2 KiB
Python
"""add manual high-risk flag and note to user
|
|
|
|
Revision ID: user_manual_risk_fields
|
|
Revises: risk_monitor_generic
|
|
"""
|
|
from __future__ import annotations
|
|
|
|
from collections.abc import Sequence
|
|
|
|
import sqlalchemy as sa
|
|
from sqlalchemy.dialects import postgresql
|
|
|
|
from alembic import op
|
|
|
|
revision: str = "user_manual_risk_fields"
|
|
down_revision: str | None = "risk_monitor_generic"
|
|
branch_labels: str | Sequence[str] | None = None
|
|
depends_on: str | Sequence[str] | None = None
|
|
|
|
_JSON = sa.JSON().with_variant(postgresql.JSONB(), "postgresql")
|
|
_INVITE_WITHDRAW_PAGE = "invite-withdraws"
|
|
|
|
|
|
def _finance_role() -> sa.TableClause:
|
|
return sa.table(
|
|
"admin_role",
|
|
sa.column("name", sa.String),
|
|
sa.column("pages", _JSON),
|
|
)
|
|
|
|
|
|
def upgrade() -> None:
|
|
with op.batch_alter_table("user") as batch_op:
|
|
batch_op.add_column(
|
|
sa.Column(
|
|
"is_high_risk",
|
|
sa.Boolean(),
|
|
server_default=sa.false(),
|
|
nullable=False,
|
|
)
|
|
)
|
|
batch_op.add_column(sa.Column("high_risk_note", sa.Text(), nullable=True))
|
|
batch_op.create_index("ix_user_is_high_risk", ["is_high_risk"], unique=False)
|
|
role = _finance_role()
|
|
conn = op.get_bind()
|
|
row = conn.execute(
|
|
sa.select(role.c.pages).where(role.c.name == "finance")
|
|
).scalar_one_or_none()
|
|
if row is not None and _INVITE_WITHDRAW_PAGE not in (row or []):
|
|
conn.execute(
|
|
role.update()
|
|
.where(role.c.name == "finance")
|
|
.values(pages=[*(row or []), _INVITE_WITHDRAW_PAGE])
|
|
)
|
|
|
|
|
|
def downgrade() -> None:
|
|
role = _finance_role()
|
|
conn = op.get_bind()
|
|
row = conn.execute(
|
|
sa.select(role.c.pages).where(role.c.name == "finance")
|
|
).scalar_one_or_none()
|
|
if row is not None:
|
|
conn.execute(
|
|
role.update()
|
|
.where(role.c.name == "finance")
|
|
.values(
|
|
pages=[
|
|
page for page in (row or []) if page != _INVITE_WITHDRAW_PAGE
|
|
]
|
|
)
|
|
)
|
|
with op.batch_alter_table("user") as batch_op:
|
|
batch_op.drop_index("ix_user_is_high_risk")
|
|
batch_op.drop_column("high_risk_note")
|
|
batch_op.drop_column("is_high_risk")
|