Files
xiaoxia-saas/packages/domain/edit_template.py
T

89 lines
2.4 KiB
Python

"""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
class EditTemplateStatus(StrEnum):
"""模板状态"""
ACTIVE = "active"
INACTIVE = "inactive"
@dataclass(slots=True)
class EditTemplate:
"""Phase 8 剪辑模板实体
全局模板库中的模板,定义剪辑风格、配置参数和预览信息。
不绑定到具体项目,可被多个 EditPlan 引用。
"""
id: str
name: str
description: str = ""
template_type: str = "default"
config: dict[str, Any] = field(default_factory=dict)
preview_url: str = ""
sort_weight: int = 0
status: EditTemplateStatus = EditTemplateStatus.ACTIVE
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",
config: dict[str, Any] | None = None,
preview_url: str = "",
sort_weight: int = 0,
status: EditTemplateStatus = EditTemplateStatus.ACTIVE,
) -> EditTemplate:
"""创建新模板实例"""
clean_name = name.strip()
if not clean_name:
raise ValueError("模板名称不能为空")
return cls(
id=uuid4().hex,
name=clean_name,
description=description.strip(),
template_type=template_type.strip() or "default",
config=config or {},
preview_url=preview_url.strip(),
sort_weight=sort_weight,
status=status,
)
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