Files
xiaoxia-saas/packages/domain/edit_template.py
T
xiaoxia 419cc3fb6a
CI/CD Pipeline / Unit Tests (push) Failing after 6m48s
CI/CD Pipeline / Staging E2E Tests (push) Failing after 1m34s
CI/CD Pipeline / Production Browser E2E (push) Failing after 1389h14m14s
CI/CD Pipeline / Build Production Worker Image (push) Failing after 1389h14m18s
CI/CD Pipeline / Build Production Web Image (push) Failing after 1389h14m18s
CI/CD Pipeline / Build Production API Image (push) Failing after 1389h14m18s
CI/CD Pipeline / Check if frontend-only change (push) Failing after 1389h14m19s
CI/CD Pipeline / Validate Code Quality And Tests (push) Has been skipped
CI/CD Pipeline / Integration Tests (push) Has been skipped
CI/CD Pipeline / Frontend Lint (push) Has been skipped
CI/CD Pipeline / Frontend Unit Tests (push) Has been skipped
CI/CD Pipeline / Build Staging API Image (push) Has been skipped
CI/CD Pipeline / Build Staging Web Image (push) Has been skipped
CI/CD Pipeline / Build Staging Worker Image (push) Has been skipped
CI/CD Pipeline / Deploy Staging (Watchtower auto-deploy) (push) Has been skipped
CI/CD Pipeline / Staging API Integration Tests (push) Has been skipped
CI/CD Pipeline / ACR Image Cleanup (push) Has been skipped
CI/CD Pipeline / Deploy Production (push) Failing after 1389h46m24s
feat(phase2): 模板发布版本化 + 回滚能力 (#646)
Co-authored-by: xiaoxia <dev@xiaoxiajianji.com>
Co-committed-by: xiaoxia <dev@xiaoxiajianji.com>
2026-07-20 18:15:00 +08:00

113 lines
3.3 KiB
Python
Executable File
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
"""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)