8ea4144518
- 新增反馈审核字段和迁移,支持 pending/adopted/rejected、未采纳原因和采纳金币 - 增加用户端反馈历史 records 接口和 admin 采纳/拒绝接口 - 采纳时同事务写状态、金币流水和审计日志,拦截重复审核 - 验证:pytest tests/test_feedback.py tests/test_admin_write.py tests/test_admin_read.py
79 lines
2.5 KiB
Python
79 lines
2.5 KiB
Python
"""feedback review fields
|
|
|
|
Revision ID: feedback_review_fields
|
|
Revises: ceb286289426
|
|
Create Date: 2026-06-22 20:00:00.000000
|
|
|
|
"""
|
|
|
|
from collections.abc import Sequence
|
|
|
|
import sqlalchemy as sa
|
|
from alembic import op
|
|
|
|
# revision identifiers, used by Alembic.
|
|
revision: str = "feedback_review_fields"
|
|
down_revision: str | Sequence[str] | None = "ceb286289426"
|
|
branch_labels: str | Sequence[str] | None = None
|
|
depends_on: str | Sequence[str] | None = None
|
|
|
|
|
|
def upgrade() -> None:
|
|
with op.batch_alter_table("feedback", schema=None) as batch_op:
|
|
batch_op.add_column(sa.Column("reject_reason", sa.String(length=256), nullable=True))
|
|
batch_op.add_column(sa.Column("reward_coins", sa.Integer(), nullable=True))
|
|
batch_op.add_column(sa.Column("review_note", sa.String(length=256), nullable=True))
|
|
batch_op.add_column(sa.Column("reviewed_by_admin_id", sa.Integer(), nullable=True))
|
|
batch_op.add_column(sa.Column("reviewed_at", sa.DateTime(timezone=True), nullable=True))
|
|
batch_op.create_index(batch_op.f("ix_feedback_status"), ["status"], unique=False)
|
|
batch_op.create_foreign_key(
|
|
batch_op.f("fk_feedback_reviewed_by_admin_id_admin_user"),
|
|
"admin_user",
|
|
["reviewed_by_admin_id"],
|
|
["id"],
|
|
)
|
|
|
|
feedback = sa.table(
|
|
"feedback",
|
|
sa.column("status", sa.String(length=16)),
|
|
)
|
|
op.execute(
|
|
feedback.update()
|
|
.where(feedback.c.status == "new")
|
|
.values(status="pending")
|
|
)
|
|
op.execute(
|
|
feedback.update()
|
|
.where(feedback.c.status == "handled")
|
|
.values(status="adopted")
|
|
)
|
|
|
|
|
|
def downgrade() -> None:
|
|
feedback = sa.table(
|
|
"feedback",
|
|
sa.column("status", sa.String(length=16)),
|
|
)
|
|
op.execute(
|
|
feedback.update()
|
|
.where(feedback.c.status == "pending")
|
|
.values(status="new")
|
|
)
|
|
op.execute(
|
|
feedback.update()
|
|
.where(feedback.c.status == "adopted")
|
|
.values(status="handled")
|
|
)
|
|
|
|
with op.batch_alter_table("feedback", schema=None) as batch_op:
|
|
batch_op.drop_constraint(
|
|
batch_op.f("fk_feedback_reviewed_by_admin_id_admin_user"),
|
|
type_="foreignkey",
|
|
)
|
|
batch_op.drop_index(batch_op.f("ix_feedback_status"))
|
|
batch_op.drop_column("reviewed_at")
|
|
batch_op.drop_column("reviewed_by_admin_id")
|
|
batch_op.drop_column("review_note")
|
|
batch_op.drop_column("reward_coins")
|
|
batch_op.drop_column("reject_reason")
|