优化脚本
This commit is contained in:
@@ -15,10 +15,6 @@ from .models import (
|
||||
ScriptSegment,
|
||||
ScriptTemplate,
|
||||
ScriptVersion,
|
||||
StoryboardFrame,
|
||||
StoryboardShot,
|
||||
StoryboardShotVersion,
|
||||
StoryboardVersion,
|
||||
SubtitleTrack,
|
||||
Timeline,
|
||||
TimelineClip,
|
||||
@@ -140,84 +136,6 @@ class BaseAssetGroupSerializer(serializers.ModelSerializer):
|
||||
return {str(asset.id): _asset_preview_url(asset) for asset in obj.candidate_assets.all()}
|
||||
|
||||
|
||||
class StoryboardFrameSerializer(serializers.ModelSerializer):
|
||||
asset_url = serializers.SerializerMethodField()
|
||||
# 分镜图含人脸,后端自动送火山人像审核;暴露审核态让前端挂盾牌(与角色/场景卡同款)
|
||||
review_status = serializers.SerializerMethodField()
|
||||
review_error = serializers.SerializerMethodField()
|
||||
|
||||
class Meta:
|
||||
model = StoryboardFrame
|
||||
fields = ["id", "script_segment", "asset", "asset_url", "sort_order", "prompt", "review_status", "review_error"]
|
||||
read_only_fields = fields
|
||||
|
||||
def get_asset_url(self, obj) -> str:
|
||||
return _asset_preview_url(obj.asset)
|
||||
|
||||
def get_review_status(self, obj) -> str:
|
||||
return obj.asset.review_status if obj.asset_id else ""
|
||||
|
||||
def get_review_error(self, obj) -> str:
|
||||
return (obj.asset.review_error or "") if obj.asset_id else ""
|
||||
|
||||
|
||||
class StoryboardVersionSerializer(serializers.ModelSerializer):
|
||||
frames = StoryboardFrameSerializer(many=True, read_only=True)
|
||||
|
||||
class Meta:
|
||||
model = StoryboardVersion
|
||||
fields = ["id", "prompt", "is_adopted", "frames", "created_at", "updated_at"]
|
||||
read_only_fields = fields
|
||||
|
||||
|
||||
# ── 故事板分镜制(对标 VideoSegment/Version):每镜一个 shot,采用版缩略图 + 各自历史版本 ──
|
||||
class StoryboardShotSerializer(serializers.ModelSerializer):
|
||||
adopted_asset = serializers.SerializerMethodField()
|
||||
adopted_asset_url = serializers.SerializerMethodField()
|
||||
# 分镜图含人脸,后端自动送火山人像审核;暴露采用版审核态让前端挂盾牌
|
||||
review_status = serializers.SerializerMethodField()
|
||||
review_error = serializers.SerializerMethodField()
|
||||
versions = serializers.SerializerMethodField()
|
||||
|
||||
class Meta:
|
||||
model = StoryboardShot
|
||||
fields = ["id", "script_segment", "sort_order", "status", "error_message", "prompt",
|
||||
"adopted_version", "adopted_asset", "adopted_asset_url", "review_status", "review_error", "versions"]
|
||||
read_only_fields = fields
|
||||
|
||||
def get_adopted_asset(self, obj):
|
||||
v = obj.adopted_version
|
||||
return str(v.asset_id) if v and v.asset_id else None
|
||||
|
||||
def get_adopted_asset_url(self, obj) -> str:
|
||||
v = obj.adopted_version
|
||||
return _asset_preview_url(v.asset) if v is not None else ""
|
||||
|
||||
def get_review_status(self, obj) -> str:
|
||||
v = obj.adopted_version
|
||||
return (getattr(v.asset, "review_status", "") or "") if (v and v.asset_id) else ""
|
||||
|
||||
def get_review_error(self, obj) -> str:
|
||||
v = obj.adopted_version
|
||||
return (getattr(v.asset, "review_error", "") or "") if (v and v.asset_id) else ""
|
||||
|
||||
def get_versions(self, obj):
|
||||
versions = sorted(obj.versions.all(), key=lambda v: (v.created_at is None, v.created_at), reverse=True)
|
||||
return [
|
||||
{
|
||||
"id": str(v.id),
|
||||
"asset": str(v.asset_id) if v.asset_id else None,
|
||||
"asset_url": _asset_preview_url(v.asset) if v.asset_id else "",
|
||||
"prompt": v.prompt,
|
||||
"is_adopted": v.is_adopted,
|
||||
"review_status": (getattr(v.asset, "review_status", "") or "") if v.asset_id else "",
|
||||
"review_error": (getattr(v.asset, "review_error", "") or "") if v.asset_id else "",
|
||||
"created_at": v.created_at.isoformat() if v.created_at else "",
|
||||
}
|
||||
for v in versions
|
||||
]
|
||||
|
||||
|
||||
class VideoSegmentVersionSerializer(serializers.ModelSerializer):
|
||||
class Meta:
|
||||
model = VideoSegmentVersion
|
||||
@@ -389,15 +307,13 @@ class QuickCreateJobSerializer(serializers.ModelSerializer):
|
||||
]
|
||||
|
||||
def get_phase_index(self, obj) -> int:
|
||||
# 前端四步:脚本 / 资产 / 故事板 / 视频。当前步未完成,不算 done。
|
||||
if obj.phase == QuickCreateJob.Phase.PRODUCTION:
|
||||
message = obj.message or ""
|
||||
return 3 if "视频" in message else 2
|
||||
# 前端三步:脚本 / 资产 / 视频(故事板已下线)。当前步未完成,不算 done。
|
||||
return {
|
||||
QuickCreateJob.Phase.PRODUCT: 0,
|
||||
QuickCreateJob.Phase.SCRIPT: 0,
|
||||
QuickCreateJob.Phase.ASSETS: 1,
|
||||
QuickCreateJob.Phase.COMPLETE: 3,
|
||||
QuickCreateJob.Phase.PRODUCTION: 2,
|
||||
QuickCreateJob.Phase.COMPLETE: 2,
|
||||
}.get(obj.phase, 0)
|
||||
|
||||
def get_settings(self, obj) -> dict:
|
||||
@@ -554,8 +470,6 @@ class ProjectSerializer(serializers.ModelSerializer):
|
||||
video_segments = VideoSegmentSerializer(many=True, read_only=True)
|
||||
script_versions = ScriptVersionSerializer(many=True, read_only=True)
|
||||
base_asset_groups = BaseAssetGroupSerializer(many=True, read_only=True)
|
||||
storyboard_versions = StoryboardVersionSerializer(many=True, read_only=True) # 过渡期保留(旧整版,新生成不再写)
|
||||
storyboard_shots = StoryboardShotSerializer(many=True, read_only=True)
|
||||
timeline = TimelineSerializer(read_only=True)
|
||||
# 合成成片地址(最新一次成功拼接):视频阶段的「播放成片 / 下载成片」直接用它
|
||||
final_video_url = serializers.SerializerMethodField()
|
||||
@@ -578,8 +492,6 @@ class ProjectSerializer(serializers.ModelSerializer):
|
||||
"stages",
|
||||
"script_versions",
|
||||
"base_asset_groups",
|
||||
"storyboard_versions",
|
||||
"storyboard_shots",
|
||||
"video_segments",
|
||||
"timeline",
|
||||
"final_video_url",
|
||||
|
||||
Reference in New Issue
Block a user