fix: 清单4 未完成项二轮(视频项目收口/选用角色/场景空镜/场景刷新 + 4:5 尺寸)
ZWQ#15 视频进度卡 3/4(真因补全): - current_stage 没推到 VIDEO 时 settle 守卫直接返回 → 永不收口。 submit/poll/adopt 幂等补推 current_stage→VIDEO;进详情(retrieve)检测全段已出片即自愈收口。 存量卡死项目一打开就自动变「已完成」。+2 测试 ZWQ#7 演员库选用角色未自动「已过审/已采用」: - 真实流程是 attach(选用),非详情弹窗按钮。attach 时显式置 adopt=adopted + 人物立绘自动送审(on_commit)。+1 测试 ZWQ#13 场景出真人致视频被拒(加强): - 场景空镜约束改为显式压过脚本描述里的人物词(「即使上文提到人也只画环境」)。 ZWQ#17 场景生成中刷新跳新窗口: - 正在生成的场景草稿不再落盘 → 生成中刷新页面不会与新实体卡并存成两个窗口。 附:平台套图 4:5 尺寸 1664x2080→1728x2160(≥Seedream 5.0 最小面积 3686400px,否则 ARK 退 400)。 Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
This commit is contained in:
@@ -238,15 +238,20 @@ class ProjectViewSet(TeamScopedViewSetMixin, ModelViewSet):
|
||||
# 用轻量查询判定 + 同步,再交给 super 做重 prefetch 序列化(避免重查询跑两遍)。
|
||||
proj = (
|
||||
Project.objects.filter(pk=kwargs.get("pk"), **{self.team_field: self.get_team()})
|
||||
.only("id", "current_stage")
|
||||
.only("id", "current_stage", "status")
|
||||
.first()
|
||||
)
|
||||
if proj is not None and proj.current_stage == ProjectStage.Stage.VIDEO:
|
||||
adopted_script = proj.script_versions.filter(is_adopted=True).order_by("-created_at").first()
|
||||
if adopted_script is not None:
|
||||
self._sync_video_segments_to_script(proj, adopted_script)
|
||||
# 自愈完成态:历史项目「全部片段已出片」却卡在 videoing(导出藏起来后没有环节翻状态),
|
||||
# 进详情时收口成 completed;若有段被重跑则退回 videoing。
|
||||
if proj is not None:
|
||||
if proj.current_stage == ProjectStage.Stage.VIDEO:
|
||||
adopted_script = proj.script_versions.filter(is_adopted=True).order_by("-created_at").first()
|
||||
if adopted_script is not None:
|
||||
self._sync_video_segments_to_script(proj, adopted_script)
|
||||
# 自愈卡阶段:历史项目「视频片段全部出片并采用」却因 current_stage 没推到 VIDEO 而永远停在
|
||||
# 「3/4 故事板」、不收口(ZWQ#15)。进详情时若检测到全段已出片,就补推到视频阶段再收口。
|
||||
segs = list(VideoSegment.objects.filter(project=proj).values_list("status", "adopted_version_id"))
|
||||
if segs and all(s == VideoSegment.Status.SUCCEEDED and a is not None for s, a in segs):
|
||||
_ensure_video_stage(proj)
|
||||
# 自愈完成态:全部片段已出片却卡在 videoing → 收口成 completed;若有段被重跑则退回 videoing。
|
||||
settle_video_completion(proj)
|
||||
return super().retrieve(request, *args, **kwargs)
|
||||
|
||||
@@ -580,7 +585,17 @@ class ProjectViewSet(TeamScopedViewSetMixin, ModelViewSet):
|
||||
group = BaseAssetGroup.objects.select_for_update().get(id=group.id)
|
||||
group.candidate_assets.add(asset)
|
||||
group.adopted_asset_id = asset.id
|
||||
group.save(update_fields=["adopted_asset", "updated_at"])
|
||||
# 选用/替换即「采用」:显式置 metadata.adopt=adopted,让卡片直接显「已采用」,不必用户再手点采用(ZWQ#7)。
|
||||
meta = dict(group.metadata or {})
|
||||
meta["adopt"] = "adopted"
|
||||
group.metadata = meta
|
||||
group.save(update_fields=["adopted_asset", "metadata", "updated_at"])
|
||||
# 人物立绘/三视图属送审类:选用后自动送审(变绿盾「已过审」),不必用户再手点灰盾(ZWQ#7)。
|
||||
# 仅当还没过审时提交;best-effort,审核服务不可用也不阻断采用。on_commit 确保资产已落库再送审。
|
||||
if asset.category in Asset.REVIEW_CATEGORIES and asset.review_status != "active":
|
||||
from apps.assets.review import submit_asset_for_review
|
||||
|
||||
transaction.on_commit(lambda a=asset: submit_asset_for_review(a))
|
||||
promote_base_asset_stage_if_ready(project)
|
||||
return Response(BaseAssetGroupSerializer(group).data)
|
||||
|
||||
|
||||
Reference in New Issue
Block a user