From 210c9d44a156c0a0a68a665e5a7316149da9cfbc Mon Sep 17 00:00:00 2001
From: patrick-motsch
Date: Sat, 7 Mar 2026 02:21:09 +0100
Subject: [PATCH] commcoach: fix PDF export crash - provide services stub for
RendererPdf
Made-with: Cursor
---
.../commcoach/serviceCommcoachExport.py | 17 +++++++++++++++--
1 file changed, 15 insertions(+), 2 deletions(-)
diff --git a/modules/features/commcoach/serviceCommcoachExport.py b/modules/features/commcoach/serviceCommcoachExport.py
index ddc90825..1db6df4e 100644
--- a/modules/features/commcoach/serviceCommcoachExport.py
+++ b/modules/features/commcoach/serviceCommcoachExport.py
@@ -140,6 +140,19 @@ def buildSessionMarkdown(session: Dict[str, Any], messages: List[Dict[str, Any]]
return "\n".join(lines)
+class _DebugUtils:
+ """Minimal stub for services.utils required by RendererPdf."""
+ @staticmethod
+ def debugLogToFile(message: str, context: str = "DEBUG"):
+ logger.debug(f"[{context}] {message}")
+
+
+class _ServicesStub:
+ """Minimal services stub providing utils for RendererPdf."""
+ def __init__(self):
+ self.utils = _DebugUtils()
+
+
async def renderDossierPdf(context: Dict[str, Any], sessions: List[Dict[str, Any]],
tasks: List[Dict[str, Any]], scores: List[Dict[str, Any]],
aiService=None) -> Optional[bytes]:
@@ -147,7 +160,7 @@ async def renderDossierPdf(context: Dict[str, Any], sessions: List[Dict[str, Any
try:
from modules.services.serviceGeneration.renderers.rendererPdf import RendererPdf
extractedContent = _buildPdfContent(context, sessions, tasks, scores, isDossier=True)
- renderer = RendererPdf()
+ renderer = RendererPdf(services=_ServicesStub())
docs = await renderer.render(extractedContent=extractedContent, title=context.get("title", "Dossier"), aiService=aiService)
if docs and len(docs) > 0:
return docs[0].documentData
@@ -166,7 +179,7 @@ async def renderSessionPdf(session: Dict[str, Any], messages: List[Dict[str, Any
from modules.services.serviceGeneration.renderers.rendererPdf import RendererPdf
title = f"Session {_formatDate(session.get('startedAt'))}"
extractedContent = _buildPdfContent({"title": title}, [session], tasks, scores, isDossier=False, messages=messages)
- renderer = RendererPdf()
+ renderer = RendererPdf(services=_ServicesStub())
docs = await renderer.render(extractedContent=extractedContent, title=title, aiService=aiService)
if docs and len(docs) > 0:
return docs[0].documentData