Add backend/app/services/exporters/report_pdf.py: export_report_pdf(report)->bytes, the additive PDF counterpart to excel.export_report_xlsx (#991). Renders a SiteFinderReport (#987) to PDF via WeasyPrint across the 6 §13 content sections (Сводка/Рынок сейчас/Будущий рынок/Продукт ТЗ/Сценарии/Скоринг). Mirrors house style: _normalize (instance or as_dict), named-const titles/CSS/ microcopy, RU labels, None→"—", graceful-never-raise, ADVISORY marker, local weasyprint import. All dynamic fields html.escape'd. STRICTLY ADDITIVE — zero edits to the 3 live PDF exporters (tradein/layout/snapshot) per tech-analyst blast-radius analysis; "unify pdf.py" deferred (would rewrite 3 working features for no gain). Endpoint wiring is #959. 16 tests (render proven via Rosetta x86_64; 6 native-render cases need Docker/CI matched-arch libgobject — pure-logic green). |
||
|---|---|---|
| .. | ||
| cadastre | ||
| etl | ||
| exporters | ||
| forecasting | ||
| generative | ||
| photos | ||
| scrapers | ||
| site_finder | ||
| __init__.py | ||
| analytics_queries.py | ||
| analytics_refresh.py | ||
| job_settings.py | ||
| objective_etl.py | ||
| objective_sync_config.py | ||