fix: render pipeline + multi-tenancy bugs (B-Fix-1 through B-Fix-9)

- Remove worker-thumbnail (no Blender, was competing on thumbnail_rendering)
- Move render_order_line_task to thumbnail_rendering queue (render-worker)
- Restore template_service.py real implementation (fix circular import shim)
- Thread tenant_id through STEP upload, Excel import, product create
- Make system tables (output_types, materials, etc.) tenant_id nullable
- Fix tenants frontend 307-redirect: use trailing slash /tenants/
- Remove Flamenco + Three.js from Admin UI (unsupported)
- Set all output_types render_backend to celery (was flamenco)

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
This commit is contained in:
2026-03-06 19:34:20 +01:00
parent 381f44bc8b
commit ab3f9c734a
14 changed files with 149 additions and 369 deletions
+3 -33
View File
@@ -239,42 +239,12 @@ def regenerate_thumbnail(self, cad_file_id: str, part_colors: dict):
@celery_app.task(name="app.tasks.step_tasks.dispatch_order_line_render", queue="step_processing")
def dispatch_order_line_render(order_line_id: str):
"""Thin wrapper that calls render_dispatcher.dispatch_render()."""
"""Route an order-line render to render_order_line_task."""
logger.info(f"Dispatching render for order line: {order_line_id}")
try:
from app.services.render_dispatcher import dispatch_render
result = dispatch_render(order_line_id)
logger.info(f"Dispatch result for {order_line_id}: {result}")
return result
except Exception as exc:
logger.error(f"dispatch_order_line_render failed for {order_line_id}: {exc}")
# Mark line as failed so it doesn't stay stuck in "processing"
try:
from sqlalchemy import create_engine, update as sql_update
from sqlalchemy.orm import Session
from app.config import settings as app_settings
from app.models.order_line import OrderLine
from datetime import datetime
sync_url = app_settings.database_url.replace("+asyncpg", "")
eng = create_engine(sync_url)
with Session(eng) as s:
s.execute(
sql_update(OrderLine)
.where(OrderLine.id == order_line_id)
.values(
render_status="failed",
render_completed_at=datetime.utcnow(),
render_log={"error": f"Dispatch failed: {str(exc)[:500]}"},
)
)
s.commit()
eng.dispose()
except Exception:
logger.exception(f"Failed to mark {order_line_id} as failed after dispatch error")
raise
render_order_line_task.delay(order_line_id)
@celery_app.task(bind=True, name="app.tasks.step_tasks.render_order_line_task", queue="step_processing", max_retries=3)
@celery_app.task(bind=True, name="app.tasks.step_tasks.render_order_line_task", queue="thumbnail_rendering", max_retries=3)
def render_order_line_task(self, order_line_id: str):
"""Render a specific output type for an order line.