- Step 14: Brand enforcement service (font/color/logo replacement, WCAG contrast check, LLM prompt context) - Step 15: Enhanced outline & slide content generation with brand context, content summary, "no hallucination" instructions - Step 15b: LLM auto-fallback retry logic across providers (FALLBACK_LLM_PROVIDERS env) - Step 16: Redis/ARQ job queue — worker entry point, presentation & master deck workers, job status/SSE endpoints, graceful fallback to BackgroundTasks when Redis unavailable Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
59 lines
2 KiB
Python
59 lines
2 KiB
Python
"""ARQ worker task: parse a master deck PPTX."""
|
|
import traceback
|
|
import uuid
|
|
from datetime import datetime
|
|
|
|
from models.sql.job import JobModel
|
|
from services.database import async_session_maker
|
|
from services.master_deck_parser_service import parse_master_deck
|
|
from services.redis_service import publish_job_progress
|
|
|
|
|
|
async def parse_master_deck_task(ctx: dict, job_id: str) -> None:
|
|
"""ARQ task: parse a master deck via the existing parser service."""
|
|
job_uuid = uuid.UUID(job_id)
|
|
|
|
async with async_session_maker() as session:
|
|
job = await session.get(JobModel, job_uuid)
|
|
if not job:
|
|
return
|
|
|
|
try:
|
|
job.status = "processing"
|
|
job.started_at = datetime.utcnow()
|
|
job.progress = 10
|
|
job.progress_message = "Parsing master deck"
|
|
await session.commit()
|
|
|
|
try:
|
|
await publish_job_progress(job_uuid, 10, "Parsing master deck")
|
|
except Exception:
|
|
pass
|
|
|
|
# The existing parser updates MasterDeckModel directly
|
|
# presentation_id is reused to store the deck_id for this job type
|
|
await parse_master_deck(job.presentation_id)
|
|
|
|
job.status = "completed"
|
|
job.progress = 100
|
|
job.progress_message = "Parsing complete"
|
|
job.completed_at = datetime.utcnow()
|
|
await session.commit()
|
|
|
|
try:
|
|
await publish_job_progress(job_uuid, 100, "Parsing complete", "completed")
|
|
except Exception:
|
|
pass
|
|
|
|
except Exception as e:
|
|
traceback.print_exc()
|
|
job.status = "failed"
|
|
job.error_message = str(e)[:500]
|
|
job.progress_message = "Parsing failed"
|
|
job.completed_at = datetime.utcnow()
|
|
await session.commit()
|
|
|
|
try:
|
|
await publish_job_progress(job_uuid, job.progress, "Parsing failed", "failed")
|
|
except Exception:
|
|
pass
|