419cc3fb6a
CI/CD Pipeline / Check if frontend-only change (push) Has been skipped
CI/CD Pipeline / Build Production API Image (push) Has been skipped
CI/CD Pipeline / Build Production Web Image (push) Has been skipped
CI/CD Pipeline / Build Production Worker Image (push) Has been skipped
CI/CD Pipeline / Deploy Production (push) Has been skipped
CI/CD Pipeline / Production Browser E2E (push) Has been skipped
CI/CD Pipeline / Build Staging Web Image (push) Successful in 3m12s
CI/CD Pipeline / Validate Code Quality And Tests (push) Successful in 5m56s
CI/CD Pipeline / Frontend Unit Tests (push) Successful in 5m58s
CI/CD Pipeline / Frontend Lint (push) Successful in 6m32s
CI/CD Pipeline / Unit Tests (push) Failing after 6m48s
CI/CD Pipeline / Build Staging API Image (push) Successful in 8m5s
CI/CD Pipeline / Integration Tests (push) Successful in 2m9s
CI/CD Pipeline / Build Staging Worker Image (push) Successful in 9m50s
CI/CD Pipeline / Deploy Staging (Watchtower auto-deploy) (push) Successful in 2m1s
CI/CD Pipeline / ACR Image Cleanup (push) Successful in 41s
CI/CD Pipeline / Staging E2E Tests (push) Failing after 1m34s
CI/CD Pipeline / Staging API Integration Tests (push) Successful in 3m40s
Co-authored-by: xiaoxia <dev@xiaoxiajianji.com> Co-committed-by: xiaoxia <dev@xiaoxiajianji.com>
113 lines
3.3 KiB
Python
Executable File
113 lines
3.3 KiB
Python
Executable File
"""EditTemplate domain entity for Phase 8 模板编排引擎."""
|
||
|
||
from __future__ import annotations
|
||
|
||
import sys
|
||
from dataclasses import dataclass, field
|
||
from datetime import datetime, timezone
|
||
|
||
if sys.version_info >= (3, 11):
|
||
from enum import StrEnum
|
||
else:
|
||
from enum import Enum
|
||
|
||
class StrEnum(str, Enum):
|
||
pass
|
||
|
||
|
||
from typing import Any
|
||
from uuid import uuid4
|
||
|
||
from .editing_mode import EditingMode
|
||
|
||
|
||
class EditTemplateStatus(StrEnum):
|
||
"""模板状态"""
|
||
|
||
ACTIVE = "active"
|
||
INACTIVE = "inactive"
|
||
|
||
|
||
_VALID_EDITING_MODES = {m.value for m in EditingMode}
|
||
|
||
|
||
@dataclass(slots=True)
|
||
class EditTemplate:
|
||
"""Phase 8 剪辑模板实体
|
||
|
||
全局模板库中的模板,定义剪辑风格、配置参数和预览信息。
|
||
不绑定到具体项目,可被多个 EditPlan 引用。
|
||
|
||
editing_mode 指定模板对应的剪辑模式(one_take / pip / voice_over / voice_pip),
|
||
决定剪辑计划生成时的片段结构。
|
||
"""
|
||
|
||
id: str
|
||
name: str
|
||
description: str = ""
|
||
template_type: str = "default"
|
||
editing_mode: str = EditingMode.ONE_TAKE.value
|
||
config: dict[str, Any] = field(default_factory=dict)
|
||
preview_url: str = ""
|
||
sort_weight: int = 0
|
||
status: EditTemplateStatus = EditTemplateStatus.ACTIVE
|
||
version: int = 1
|
||
created_at: datetime = field(default_factory=lambda: datetime.now(timezone.utc))
|
||
updated_at: datetime = field(default_factory=lambda: datetime.now(timezone.utc))
|
||
|
||
@classmethod
|
||
def create(
|
||
cls,
|
||
name: str,
|
||
*,
|
||
description: str = "",
|
||
template_type: str = "default",
|
||
editing_mode: str = EditingMode.ONE_TAKE.value,
|
||
config: dict[str, Any] | None = None,
|
||
preview_url: str = "",
|
||
sort_weight: int = 0,
|
||
status: EditTemplateStatus = EditTemplateStatus.ACTIVE,
|
||
version: int = 1,
|
||
) -> EditTemplate:
|
||
"""创建新模板实例"""
|
||
clean_name = name.strip()
|
||
if not clean_name:
|
||
raise ValueError("模板名称不能为空")
|
||
clean_mode = editing_mode.strip() or EditingMode.ONE_TAKE.value
|
||
if clean_mode not in _VALID_EDITING_MODES:
|
||
raise ValueError(
|
||
f"无效的 editing_mode: {clean_mode}," f"允许值: {', '.join(sorted(_VALID_EDITING_MODES))}"
|
||
)
|
||
return cls(
|
||
id=uuid4().hex,
|
||
name=clean_name,
|
||
description=description.strip(),
|
||
template_type=template_type.strip() or "default",
|
||
editing_mode=clean_mode,
|
||
config=config or {},
|
||
preview_url=preview_url.strip(),
|
||
sort_weight=sort_weight,
|
||
status=status,
|
||
version=version,
|
||
)
|
||
|
||
def activate(self) -> None:
|
||
"""激活模板"""
|
||
self.status = EditTemplateStatus.ACTIVE
|
||
self.updated_at = datetime.now(timezone.utc)
|
||
|
||
def deactivate(self) -> None:
|
||
"""停用模板"""
|
||
self.status = EditTemplateStatus.INACTIVE
|
||
self.updated_at = datetime.now(timezone.utc)
|
||
|
||
@property
|
||
def is_active(self) -> bool:
|
||
"""模板是否处于激活状态"""
|
||
return self.status == EditTemplateStatus.ACTIVE
|
||
|
||
def bump_version(self) -> None:
|
||
"""版本号+1,发布时调用"""
|
||
self.version += 1
|
||
self.updated_at = datetime.now(timezone.utc)
|