UX X3: PDF export «Site Analysis Report» (WeasyPrint) #49

Closed
opened 2026-05-11 20:18:09 +00:00 by lekss361 · 2 comments
lekss361 commented 2026-05-11 20:18:09 +00:00 (Migrated from github.com)

Эшелон: 🟣 Explainability / UX

Контекст / проблема

После встречи с девелопером нужно оставить физический артефакт — PDF-отчёт по участку. Сейчас screenshot-only. Существует backend/app/services/exporters/pdf.py (WeasyPrint), используется для Generative, но не для site-finder.

Что сделать

Backend

  1. Endpoint GET /api/v1/parcels/{cad}/report.pdf?profile=comfort
  2. WeasyPrint template app/templates/site_report.html (структура):
    • Header: cad_num, дата, район
    • Gate verdict banner
    • Map screenshot (через headless chromium либо static-tile composition)
    • Score breakdown table (categories + values + verbal)
    • Demand section: market price, velocity, absorption, pipeline
    • Competitors table
    • Confidence + caveats footer
  3. Map screenshot — самый сложный кусок:
    • Option A: headless chromium screenshot Leaflet (медленно, тяжело)
    • Option B: static tile composition (Mapbox static API, либо raster tile combine)
    • Recommend B — быстрее, проще
  4. PDF caching (5 мин Redis) для дешевизны re-download

Frontend

  1. Кнопка «📄 PDF-отчёт» в /site-finder под score card
  2. Hidden file download через fetch + blob

Acceptance

  • PDF генерируется < 5 сек
  • Карта читаема, polygon участка видим
  • Все секции analyze попали в PDF
  • PDF под 1MB (для email)

Owner

backend-engineer (WeasyPrint + map render) + frontend-engineer (download button)

Effort

1.5–2 дня

Dependencies

  • X1 (breakdown в PDF) — рекомендуется делать после
  • Косвенно G5, X2 (если хотим gate + confidence в PDF)

Risks / open

  • Headless chromium на VPS — тяжёлый. Static tile composition проще, но менее интерактивный
  • WeasyPrint Cyrillic font — проверить шрифты
**Эшелон:** 🟣 Explainability / UX ## Контекст / проблема После встречи с девелопером нужно оставить **физический артефакт** — PDF-отчёт по участку. Сейчас screenshot-only. Существует `backend/app/services/exporters/pdf.py` (WeasyPrint), используется для Generative, но не для site-finder. ## Что сделать ### Backend 1. Endpoint `GET /api/v1/parcels/{cad}/report.pdf?profile=comfort` 2. WeasyPrint template `app/templates/site_report.html` (структура): - Header: cad_num, дата, район - **Gate verdict** banner - Map screenshot (через headless chromium либо static-tile composition) - Score breakdown table (categories + values + verbal) - Demand section: market price, velocity, absorption, pipeline - Competitors table - Confidence + caveats footer 3. Map screenshot — самый сложный кусок: - Option A: headless chromium screenshot Leaflet (медленно, тяжело) - Option B: static tile composition (Mapbox static API, либо raster tile combine) - **Recommend B** — быстрее, проще 4. PDF caching (5 мин Redis) для дешевизны re-download ### Frontend 1. Кнопка «📄 PDF-отчёт» в `/site-finder` под score card 2. Hidden file download через fetch + blob ## Acceptance - [ ] PDF генерируется < 5 сек - [ ] Карта читаема, polygon участка видим - [ ] Все секции analyze попали в PDF - [ ] PDF под 1MB (для email) ## Owner `backend-engineer` (WeasyPrint + map render) + `frontend-engineer` (download button) ## Effort 1.5–2 дня ## Dependencies - X1 (breakdown в PDF) — рекомендуется делать после - Косвенно G5, X2 (если хотим gate + confidence в PDF) ## Risks / open - Headless chromium на VPS — тяжёлый. Static tile composition проще, но менее интерактивный - WeasyPrint Cyrillic font — проверить шрифты
Owner

Status update — частично прогресс через PR #199 (feat(layouts): PDF ТЗ endpoint + BestLayoutsBlock UI, #113 PR D). WeasyPrint используется для layout ТЗ PDF.

Что сделано:

  • backend/app/services/exporters/layout_tz_pdf.py для layout ТЗ
  • WeasyPrint infra поднята

Что НЕ сделано (полный Site Analysis Report):

  • app/templates/site_report.html для full analyze response
  • Endpoint GET /api/v1/parcels/{cad}/report.pdf?profile=...
  • Map screenshot (option B static tile composition)
  • Frontend кнопка «PDF-отчёт» в /site-finder под score card

Issue валиден, остаётся в backlog priority/normal. WeasyPrint pattern переиспользуем.

Status update — частично прогресс через PR #199 (`feat(layouts): PDF ТЗ endpoint + BestLayoutsBlock UI`, #113 PR D). WeasyPrint используется для layout ТЗ PDF. **Что сделано:** - `backend/app/services/exporters/layout_tz_pdf.py` для layout ТЗ - WeasyPrint infra поднята **Что НЕ сделано (полный Site Analysis Report):** - `app/templates/site_report.html` для full analyze response - Endpoint `GET /api/v1/parcels/{cad}/report.pdf?profile=...` - Map screenshot (option B static tile composition) - Frontend кнопка «PDF-отчёт» в `/site-finder` под score card Issue валиден, остаётся в backlog priority/normal. WeasyPrint pattern переиспользуем.
Collaborator

Ground-truth 2026-06-13. DRIFT: exporters/report_pdf.py — §13 Site Finder v2 PDF (#989, WeasyPrint, рендерит SiteFinderReport), wired GET /{cad}/forecast/export?format=. Commit 33d1a63. Реализовано.

**Ground-truth 2026-06-13.** DRIFT: exporters/report_pdf.py — §13 Site Finder v2 PDF (#989, WeasyPrint, рендерит SiteFinderReport), wired GET /{cad}/forecast/export?format=. Commit 33d1a63. Реализовано.
Sign in to join this conversation.
No project
No assignees
3 participants
Notifications
Due date
The due date is invalid or out of range. Please use the format "yyyy-mm-dd".

No due date set.

Dependencies

No dependencies set.

Reference: lekss361/gendesign#49
No description provided.