fix: medium audit items — CORS config, invoice description, path helper, node failure, order prefix
M3: cors_origins setting in config.py (env CORS_ORIGINS); main.py reads from settings.
M4: add build_order_line_step_render_dir() to render_paths.py; tasks.py drops placeholder.mp4 trick.
M5: unknown workflow graph nodes now fail the run (status="failed" + logger.error) instead of silently skipping.
M6: invoice line description is now "{product} — {output_type}" instead of bare UUID; eager-loads relations.
M7: order_number_prefix setting in config.py (env ORDER_NUMBER_PREFIX, default "SA").
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
This commit is contained in:
@@ -13,6 +13,7 @@ from pathlib import Path
|
||||
from app.core.render_paths import (
|
||||
build_order_line_export_path,
|
||||
build_order_line_step_render_path,
|
||||
build_order_line_step_render_dir,
|
||||
ensure_group_writable_dir,
|
||||
)
|
||||
from app.tasks.celery_app import celery_app
|
||||
@@ -931,20 +932,19 @@ def render_turntable_task(
|
||||
if not step_path:
|
||||
raise RuntimeError(f"Cannot resolve STEP path for order_line {order_line_id}")
|
||||
step = Path(step_path)
|
||||
canonical_output_dir = build_order_line_step_render_path(
|
||||
canonical_output_dir = build_order_line_step_render_dir(
|
||||
step,
|
||||
order_line_id,
|
||||
"placeholder.mp4",
|
||||
ensure_exists=True,
|
||||
)
|
||||
if output_dir and Path(output_dir) != canonical_output_dir.parent:
|
||||
if output_dir and Path(output_dir) != canonical_output_dir:
|
||||
logger.warning(
|
||||
"render_turntable_task overriding non-canonical output_dir=%s with %s for order_line=%s",
|
||||
output_dir,
|
||||
canonical_output_dir.parent,
|
||||
canonical_output_dir,
|
||||
order_line_id,
|
||||
)
|
||||
output_dir = str(canonical_output_dir.parent)
|
||||
output_dir = str(canonical_output_dir)
|
||||
elif output_dir is None:
|
||||
raise RuntimeError("render_turntable_task requires output_dir when invoked with a STEP path")
|
||||
else:
|
||||
|
||||
@@ -508,12 +508,17 @@ def execute_graph_workflow(
|
||||
continue
|
||||
|
||||
metadata["execution_kind"] = definition.execution_kind if definition is not None else "bridge"
|
||||
node_result.status = "skipped"
|
||||
node_result.status = "failed"
|
||||
node_result.output = metadata
|
||||
node_result.log = f"Graph runtime not implemented for step '{node.step.value}'"
|
||||
node_result.log = f"No graph runtime executor for step '{node.step.value}' — add it to STEP_TASK_MAP or _BRIDGE_EXECUTORS"
|
||||
node_result.duration_s = None
|
||||
logger.error(
|
||||
"Workflow run %s has no executor for step '%s' (node %s) — marking run as failed",
|
||||
workflow_context.workflow_run_id,
|
||||
node.step.value,
|
||||
node.id,
|
||||
)
|
||||
session.flush()
|
||||
skipped_node_ids.append(node.id)
|
||||
|
||||
run.celery_task_id = task_ids[0] if task_ids else None
|
||||
if any(node_result.status == "failed" for node_result in run.node_results):
|
||||
|
||||
Reference in New Issue
Block a user