feat: add workflow run dispatch foundation
This commit is contained in:
@@ -13,7 +13,6 @@ task-dispatch logic in app.services.render_dispatcher (legacy path).
|
||||
from __future__ import annotations
|
||||
|
||||
import logging
|
||||
from datetime import datetime
|
||||
|
||||
logger = logging.getLogger(__name__)
|
||||
|
||||
@@ -32,7 +31,9 @@ def dispatch_render_with_workflow(order_line_id: str) -> dict:
|
||||
|
||||
from app.config import settings
|
||||
from app.domains.orders.models import OrderLine
|
||||
from app.domains.rendering.models import OutputType, WorkflowDefinition, WorkflowRun
|
||||
from app.domains.rendering.models import OutputType, WorkflowDefinition
|
||||
from app.domains.rendering.workflow_executor import prepare_workflow_context
|
||||
from app.domains.rendering.workflow_run_service import create_workflow_run, mark_workflow_run_failed
|
||||
|
||||
engine = create_engine(
|
||||
settings.database_url.replace("+asyncpg", ""),
|
||||
@@ -96,6 +97,22 @@ def dispatch_render_with_workflow(order_line_id: str) -> dict:
|
||||
workflow_type,
|
||||
)
|
||||
|
||||
try:
|
||||
workflow_context = prepare_workflow_context(
|
||||
wf_def.config,
|
||||
context_id=order_line_id,
|
||||
execution_mode="legacy",
|
||||
)
|
||||
except Exception as exc:
|
||||
logger.warning(
|
||||
"order_line %s: workflow_definition_id %s failed runtime preparation (%s), "
|
||||
"falling back to legacy dispatch",
|
||||
order_line_id,
|
||||
wf_def.id,
|
||||
exc,
|
||||
)
|
||||
return _legacy_dispatch(order_line_id)
|
||||
|
||||
# For turntable workflows: resolve step_path + output_dir from the order line at runtime
|
||||
if workflow_type == "turntable" and ("step_path" not in params or "output_dir" not in params):
|
||||
from app.domains.products.models import CadFile as _CadFile
|
||||
@@ -120,19 +137,43 @@ def dispatch_render_with_workflow(order_line_id: str) -> dict:
|
||||
str(_Path(_cfg.upload_dir) / "renders" / str(line.id)),
|
||||
)
|
||||
|
||||
from app.domains.rendering.workflow_builder import dispatch_workflow
|
||||
celery_task_id = dispatch_workflow(workflow_type, order_line_id, params)
|
||||
run = None
|
||||
try:
|
||||
run = create_workflow_run(
|
||||
session,
|
||||
workflow_def_id=wf_def.id,
|
||||
order_line_id=line.id,
|
||||
workflow_context=workflow_context,
|
||||
)
|
||||
session.commit()
|
||||
except Exception as exc:
|
||||
session.rollback()
|
||||
logger.warning(
|
||||
"order_line %s: failed to create workflow run for workflow_definition_id %s (%s), "
|
||||
"falling back to legacy dispatch",
|
||||
order_line_id,
|
||||
wf_def.id,
|
||||
exc,
|
||||
)
|
||||
return _legacy_dispatch(order_line_id)
|
||||
|
||||
# Persist a WorkflowRun record
|
||||
run = WorkflowRun(
|
||||
workflow_def_id=wf_def.id,
|
||||
order_line_id=line.id,
|
||||
celery_task_id=celery_task_id,
|
||||
status="pending",
|
||||
started_at=datetime.utcnow(),
|
||||
)
|
||||
session.add(run)
|
||||
session.commit()
|
||||
from app.domains.rendering.workflow_builder import dispatch_workflow
|
||||
|
||||
try:
|
||||
celery_task_id = dispatch_workflow(workflow_type, order_line_id, params)
|
||||
run.celery_task_id = celery_task_id
|
||||
session.commit()
|
||||
except Exception as exc:
|
||||
session.rollback()
|
||||
session.add(run)
|
||||
mark_workflow_run_failed(run, str(exc))
|
||||
session.commit()
|
||||
logger.exception(
|
||||
"order_line %s: workflow dispatch via definition %s failed, falling back to legacy dispatch",
|
||||
order_line_id,
|
||||
wf_def.id,
|
||||
)
|
||||
return _legacy_dispatch(order_line_id)
|
||||
|
||||
return {
|
||||
"backend": "workflow",
|
||||
|
||||
Reference in New Issue
Block a user