mirror of
https://github.com/jxxghp/MoviePilot.git
synced 2026-08-30 12:36:55 +08:00
166 lines
4.8 KiB
Python
166 lines
4.8 KiB
Python
from typing import List, Mapping, Tuple, Optional, Any
|
|
|
|
from sqlalchemy import delete as sqlalchemy_delete
|
|
|
|
from app.db.base import DbOper
|
|
from app.db.models.workflow import Workflow
|
|
|
|
|
|
class WorkflowOper(DbOper):
|
|
"""
|
|
工作流管理
|
|
"""
|
|
|
|
def add(self, **kwargs) -> Tuple[bool, str]:
|
|
"""
|
|
新增工作流
|
|
"""
|
|
wf = Workflow(**kwargs)
|
|
if not wf.get_by_name(self._db, kwargs.get("name")):
|
|
wf.create(self._db)
|
|
return True, "新增工作流成功"
|
|
return False, "工作流已存在"
|
|
|
|
def get(self, wid: int) -> Optional[Workflow]:
|
|
"""
|
|
查询单个工作流
|
|
"""
|
|
return Workflow.get(self._db, wid)
|
|
|
|
def stage_state(self, workflow_id: int, state: str) -> bool:
|
|
"""暂存工作流状态变更,不由模型方法自行提交。"""
|
|
workflow = self.get(workflow_id)
|
|
if not workflow:
|
|
return False
|
|
workflow.state = state
|
|
return True
|
|
|
|
def stage_update(
|
|
self,
|
|
workflow_id: int,
|
|
payload: Mapping[str, Any],
|
|
) -> Optional[Workflow]:
|
|
"""暂存工作流字段更新并返回同一会话中的对象。"""
|
|
workflow = self.get(workflow_id)
|
|
if not workflow:
|
|
return None
|
|
for key, value in payload.items():
|
|
if key != "id":
|
|
setattr(workflow, key, value)
|
|
return workflow
|
|
|
|
def stage_delete(self, workflow_id: int) -> None:
|
|
"""暂存工作流删除,由请求级 UnitOfWork 统一提交。"""
|
|
self._db.execute(
|
|
sqlalchemy_delete(Workflow).where(Workflow.id == workflow_id)
|
|
)
|
|
|
|
async def async_get(self, wid: int) -> Optional[Workflow]:
|
|
"""
|
|
异步查询单个工作流
|
|
"""
|
|
return await Workflow.async_get(self._db, wid)
|
|
|
|
def list(self) -> List[Workflow]:
|
|
"""
|
|
获取所有工作流列表
|
|
"""
|
|
return Workflow.list(self._db)
|
|
|
|
async def async_list(self) -> List[Workflow]:
|
|
"""
|
|
异步获取所有工作流列表
|
|
"""
|
|
return await Workflow.async_list(self._db)
|
|
|
|
def list_enabled(self) -> List[Workflow]:
|
|
"""
|
|
获取启用的工作流列表
|
|
"""
|
|
return Workflow.get_enabled_workflows(self._db)
|
|
|
|
def get_timer_triggered_workflows(self) -> List[Workflow]:
|
|
"""
|
|
获取定时触发的工作流列表
|
|
"""
|
|
return Workflow.get_timer_triggered_workflows(self._db)
|
|
|
|
def get_event_triggered_workflows(self) -> List[Workflow]:
|
|
"""
|
|
获取事件触发的工作流列表
|
|
"""
|
|
return Workflow.get_event_triggered_workflows(self._db)
|
|
|
|
def get_by_name(self, name: str) -> Workflow:
|
|
"""
|
|
按名称获取工作流
|
|
"""
|
|
return Workflow.get_by_name(self._db, name)
|
|
|
|
async def async_get_by_name(self, name: str) -> Optional[Workflow]:
|
|
"""
|
|
异步按名称获取工作流
|
|
"""
|
|
return await Workflow.async_get_by_name(self._db, name)
|
|
|
|
async def stage_create(self, payload: Mapping[str, Any]) -> Workflow:
|
|
"""暂存新工作流,不在操作器内提交事务。"""
|
|
workflow = Workflow(**dict(payload))
|
|
self._db.add(workflow)
|
|
await self._db.flush()
|
|
return workflow
|
|
|
|
async def stage_reset(
|
|
self,
|
|
workflow_id: int,
|
|
reset_count: bool = False,
|
|
) -> Optional[Workflow]:
|
|
"""暂存工作流重置字段,不触发模型装饰器的隐式提交。"""
|
|
workflow = await self.async_get(workflow_id)
|
|
if not workflow:
|
|
return None
|
|
workflow.state = "W"
|
|
workflow.result = None
|
|
workflow.current_action = None
|
|
workflow.context = {}
|
|
workflow.execution_state = {}
|
|
if reset_count:
|
|
workflow.run_count = 0
|
|
return workflow
|
|
|
|
def start(self, wid: int) -> bool:
|
|
"""
|
|
启动
|
|
"""
|
|
return Workflow.start(self._db, wid)
|
|
|
|
def success(self, wid: int, result: Optional[str] = None) -> bool:
|
|
"""
|
|
成功
|
|
"""
|
|
return Workflow.success(self._db, wid, result)
|
|
|
|
def fail(self, wid: int, result: str) -> bool:
|
|
"""
|
|
失败
|
|
"""
|
|
return Workflow.fail(self._db, wid, result)
|
|
|
|
def step(self, wid: int, action_id: str, context: dict, execution_state: Optional[dict] = None) -> bool:
|
|
"""
|
|
步进
|
|
"""
|
|
return Workflow.update_current_action(
|
|
self._db,
|
|
wid,
|
|
action_id,
|
|
context,
|
|
execution_state
|
|
)
|
|
|
|
def reset(self, wid: int, reset_count: bool = False) -> bool:
|
|
"""
|
|
重置
|
|
"""
|
|
return Workflow.reset(self._db, wid, reset_count=reset_count)
|