From da3e88cef16b68f9fa349d54dc2431b3095e3f43 Mon Sep 17 00:00:00 2001 From: Maciej Pienczyn Date: Fri, 20 Feb 2026 12:50:18 +0100 Subject: [PATCH] fix: use absolute path for libreoffice and handle errors gracefully - Use /usr/bin/libreoffice (Gunicorn has limited PATH) - Set HOME=/tmp (LibreOffice needs writable home dir) - Handle FileNotFoundError with user-friendly message - Improve error flash messages in Polish Co-Authored-By: Claude Opus 4.6 --- blueprints/board/routes.py | 13 +++++++++---- 1 file changed, 9 insertions(+), 4 deletions(-) diff --git a/blueprints/board/routes.py b/blueprints/board/routes.py index 69af3bc..54c6d40 100644 --- a/blueprints/board/routes.py +++ b/blueprints/board/routes.py @@ -568,16 +568,21 @@ def document_view(doc_id): if not os.path.exists(pdf_path): try: result = subprocess.run( - ['libreoffice', '--headless', '--convert-to', 'pdf', + ['/usr/bin/libreoffice', '--headless', '--convert-to', 'pdf', '--outdir', os.path.dirname(file_path), file_path], - capture_output=True, timeout=30 + capture_output=True, timeout=30, + env={**os.environ, 'HOME': '/tmp'} ) if result.returncode != 0: current_app.logger.error(f"DOCX to PDF conversion failed: {result.stderr.decode()}") - flash('Nie udało się przekonwertować dokumentu do PDF.', 'error') + flash('Nie udało się otworzyć dokumentu — konwersja do PDF nie powiodła się.', 'error') return redirect(url_for('board.meeting_view', meeting_id=doc.meeting_id)) + except FileNotFoundError: + current_app.logger.error("LibreOffice not found at /usr/bin/libreoffice") + flash('Podgląd dokumentów Word nie jest dostępny na tym serwerze. Użyj przycisku „Pobierz".', 'error') + return redirect(url_for('board.meeting_view', meeting_id=doc.meeting_id)) except subprocess.TimeoutExpired: - flash('Konwersja dokumentu trwała za długo.', 'error') + flash('Konwersja dokumentu trwała za długo. Użyj przycisku „Pobierz".', 'error') return redirect(url_for('board.meeting_view', meeting_id=doc.meeting_id)) pdf_name = doc.original_filename.rsplit('.', 1)[0] + '.pdf'