fix: 状态枚举添加_missing_兼容历史脏数据,修复Staging模板生成接口500 #809 #835

Merged
xiaoxia merged 1 commits from bugfix/809-generation-task-status-missing into develop 2026-07-25 10:04:00 +08:00
Owner

问题

Staging 环境模板生成接口和任务列表接口返回500(#809),E2E测试失败。

根因

Staging PostgreSQL 有历史脏数据(早期版本的状态值如 success/done 等),GenerationTaskStatus 枚举缺少 _missing_ 兼容方法,从 DB 读取时枚举转换抛 ValueError,触发500。

两个500接口的共性:都调用 generation_task_repository.list_by_user_filtered()_to_domain()GenerationTaskStatus(model.status) 枚举转换。

同类问题:EditPlanStatusEditPlanClipStatus 也缺 _missing_,有同样的潜在风险,一并修复。

修复

参照 AssetStatusClassificationJobStatus 的已有模式,给三个枚举都加上 _missing_ 方法:

  • 兼容常见历史别名(success/done/fail/error/cancel 等)
  • 未知值兜底到初始态(PENDING/DRAFT),不阻塞业务
  • 大小写不敏感 + 自动 strip 空格

改动

  • packages/domain/generation_task.pyGenerationTaskStatus._missing_
  • packages/domain/edit_plan.pyEditPlanStatus._missing_
  • packages/domain/edit_plan_clip.pyEditPlanClipStatus._missing_
  • tests/unit/test_generation_task_status_enum.py:32个兼容性单测(全绿)
## 问题 Staging 环境模板生成接口和任务列表接口返回500(#809),E2E测试失败。 ## 根因 Staging PostgreSQL 有历史脏数据(早期版本的状态值如 `success`/`done` 等),`GenerationTaskStatus` 枚举缺少 `_missing_` 兼容方法,从 DB 读取时枚举转换抛 `ValueError`,触发500。 两个500接口的共性:都调用 `generation_task_repository.list_by_user_filtered()` → `_to_domain()` → `GenerationTaskStatus(model.status)` 枚举转换。 同类问题:`EditPlanStatus` 和 `EditPlanClipStatus` 也缺 `_missing_`,有同样的潜在风险,一并修复。 ## 修复 参照 `AssetStatus` 和 `ClassificationJobStatus` 的已有模式,给三个枚举都加上 `_missing_` 方法: - 兼容常见历史别名(success/done/fail/error/cancel 等) - 未知值兜底到初始态(PENDING/DRAFT),不阻塞业务 - 大小写不敏感 + 自动 strip 空格 ## 改动 - `packages/domain/generation_task.py`:`GenerationTaskStatus._missing_` - `packages/domain/edit_plan.py`:`EditPlanStatus._missing_` - `packages/domain/edit_plan_clip.py`:`EditPlanClipStatus._missing_` - `tests/unit/test_generation_task_status_enum.py`:32个兼容性单测(全绿)
xiaoxia added 1 commit 2026-07-25 00:06:38 +08:00
fix: 状态枚举添加_missing_兼容历史脏数据,修复Staging 500 #809
CI/CD Pipeline / Check if frontend-only change (pull_request) Successful in 37s
CI/CD Pipeline / Validate - Type Check (mypy) (pull_request) Successful in 1m15s
CI/CD Pipeline / Frontend Lint (pull_request) Successful in 44s
CI/CD Pipeline / Validate - Migration (alembic) (pull_request) Successful in 1m6s
CI/CD Pipeline / Build Staging API Image (pull_request) Has been skipped
CI/CD Pipeline / Build Staging Web Image (pull_request) Has been skipped
CI/CD Pipeline / Build Staging Worker Image (pull_request) Has been skipped
CI/CD Pipeline / PR Build Web Image (pull_request) Successful in 44s
CI/CD Pipeline / PR Build Worker Image (pull_request) Successful in 37s
Preview Deploy / Deploy Preview Environment (pull_request) Failing after 24s
CI/CD Pipeline / Validate - Code Quality (pull_request) Successful in 4m6s
CI/CD Pipeline / PR Build API Image (pull_request) Successful in 3m57s
AI Code Review / AI Code Review (pull_request) Successful in 3m52s
PR Automation / Auto Approve on CI Green (pull_request) Successful in 3m40s
CI/CD Pipeline / Frontend Unit Tests (pull_request) Has been skipped
CI/CD Pipeline / Build Production API Image (pull_request) Has been skipped
CI/CD Pipeline / Build Production Web Image (pull_request) Has been skipped
CI/CD Pipeline / Build Production Worker Image (pull_request) Has been skipped
CI/CD Pipeline / Deploy Staging (Watchtower auto-deploy) (pull_request) Has been skipped
CI/CD Pipeline / Unit Tests (pull_request) Failing after 2m27s
PR Automation / Auto Merge on CI Green + Approved (pull_request) Successful in 16m20s
CI/CD Pipeline / Integration Tests (pull_request) Successful in 2m37s
CI/CD Pipeline / Deploy Production (pull_request) Has been skipped
CI/CD Pipeline / Staging E2E Tests (pull_request) Has been skipped
CI/CD Pipeline / Staging API Integration Tests (pull_request) Has been skipped
CI/CD Pipeline / ACR Image Cleanup (pull_request) Has been skipped
CI/CD Pipeline / Production Browser E2E (pull_request) Has been skipped
Preview Cleanup / Cleanup Preview Environment (pull_request) Successful in 9s
528bcaf59f
根因:Staging PostgreSQL有历史脏数据(如success/done等旧状态值),
GenerationTaskStatus/EditPlanStatus/EditPlanClipStatus枚举缺少_missing_
兼容方法,导致枚举转换抛ValueError触发500。

修复:参照AssetStatus/ClassificationJobStatus的模式,给三个枚举都加上
_missing_方法,兼容常见历史别名,未知值兜底到初始态(不阻塞业务)。

修改范围:
- packages/domain/generation_task.py: GenerationTaskStatus._missing_
- packages/domain/edit_plan.py: EditPlanStatus._missing_
- packages/domain/edit_plan_clip.py: EditPlanClipStatus._missing_
- tests/unit/test_generation_task_status_enum.py: 32个兼容性单测
xiaoxia force-pushed bugfix/809-generation-task-status-missing from 79a0ab457c to 528bcaf59f 2026-07-25 00:06:38 +08:00 Compare
Collaborator

代码审查结果 - PR #835

⚠️ 问题(0个需要修改)

💡 建议(2个可选)

  1. packages/domain/generation_task.py 第53行 (及其他文件类似行)_missing_ 方法中的映射列表包含冗余值。
    • 具体内容:代码中检查 normalized in ("done", ..., "completed"),由于枚举中已定义 COMPLETED = "completed",当传入 "completed" 时 Python 会直接匹配成功,根本不会调用 _missing_。建议移除列表中与枚举值完全一致的字符串(如 "completed", "failed", "cancelled" 等),以保持代码整洁,避免误导。
  2. tests/unit/test_generation_task_status_enum.py:测试覆盖率不完整。
    • 具体内容:PR 同时修改了 EditPlanStatusEditPlanClipStatus 的逻辑,但仅新增了 GenerationTaskStatus 的单元测试。虽然逻辑相似,但为了防止未来修改导致的不一致,建议补充另外两个枚举的兼容性测试。

格式检查通过 | 逻辑审查通过 | 性能无明显问题


🤖 由 AI 代码审查机器人自动生成 | 2026-07-24 16:18:53 | 模型:

## 代码审查结果 - PR #835 ### ⚠️ 问题(0个需要修改) 无 ### 💡 建议(2个可选) 1. **packages/domain/generation_task.py 第53行 (及其他文件类似行)**:`_missing_` 方法中的映射列表包含冗余值。 - 具体内容:代码中检查 `normalized in ("done", ..., "completed")`,由于枚举中已定义 `COMPLETED = "completed"`,当传入 `"completed"` 时 Python 会直接匹配成功,根本不会调用 `_missing_`。建议移除列表中与枚举值完全一致的字符串(如 `"completed"`, `"failed"`, `"cancelled"` 等),以保持代码整洁,避免误导。 2. **tests/unit/test_generation_task_status_enum.py**:测试覆盖率不完整。 - 具体内容:PR 同时修改了 `EditPlanStatus` 和 `EditPlanClipStatus` 的逻辑,但仅新增了 `GenerationTaskStatus` 的单元测试。虽然逻辑相似,但为了防止未来修改导致的不一致,建议补充另外两个枚举的兼容性测试。 --- ✅ 格式检查通过 | ✅ 逻辑审查通过 | ✅ 性能无明显问题 --- <sub>🤖 由 AI 代码审查机器人自动生成 | 2026-07-24 16:18:53 | 模型: </sub> <!-- AI_CODE_REVIEW_AUTO_COMMENT -->
xiaoxia merged commit be0b4f4dac into develop 2026-07-25 10:04:00 +08:00
xiaoxia deleted branch bugfix/809-generation-task-status-missing 2026-07-25 10:04:00 +08:00

🗑️ 预览环境已清理

PR #835 已关闭或合并,对应的预览环境已被清理。

如有需要,可以重新打开 PR 来重新生成预览环境。

🗑️ **预览环境已清理** PR #835 已关闭或合并,对应的预览环境已被清理。 > 如有需要,可以重新打开 PR 来重新生成预览环境。
Sign in to join this conversation.