diff --git a/backend/app/api/v1/parcels.py b/backend/app/api/v1/parcels.py index eea80c34..74ae4a21 100644 --- a/backend/app/api/v1/parcels.py +++ b/backend/app/api/v1/parcels.py @@ -1302,9 +1302,19 @@ def export_parcel_forecast( # pdf — байты (WeasyPrint), отдельной веткой (зеркало pptx early-return): §13-отчёт # из export_report_pdf (#1739). md/json string-ветки остаются байт-в-байт прежними. + # WeasyPrint-рендер — отдельная зона отказа (шрифты, шаблон, движок): без обёртки + # ошибка всплывает 500-кой без объяснения причины. logger.exception сохраняет + # traceback причины 500 (#1739), пользователю — безопасное RU-сообщение. if format == "pdf": + try: + pdf_bytes = export_report_pdf(run.result) + except HTTPException: + raise + except Exception as exc: + logger.exception("forecast PDF render failed for %s", cad_num) + raise HTTPException(status_code=500, detail="Ошибка генерации PDF-форсайта") from exc return Response( - content=export_report_pdf(run.result), + content=pdf_bytes, media_type="application/pdf", headers={"Content-Disposition": f'attachment; filename="{base_name}.pdf"'}, ) @@ -3494,8 +3504,7 @@ def parcel_snapshot_pdf( raise HTTPException( status_code=404, detail=( - f"Участок {cad_num} не найден в БД. " - "Используйте POST /analyze для загрузки." + f"Участок {cad_num} не найден в БД. " "Используйте POST /analyze для загрузки." ), ) @@ -3618,9 +3627,7 @@ def parcel_snapshot_pdf( raise except Exception as exc: logger.exception("snapshot data fetch failed for %s", cad_num) - raise HTTPException( - status_code=500, detail="Ошибка сбора данных для PDF-снимка" - ) from exc + raise HTTPException(status_code=500, detail="Ошибка сбора данных для PDF-снимка") from exc # 7) Сгенерировать PDF (WeasyPrint-рендер — отдельная зона отказа: шрифты, # шаблон, движок). logger.exception сохраняет traceback причины 500 (#1739).