feat(exporters): PURE HTML-агрегатор §1–§3 + альтернативы (#2259 PR-A Foundation) #2284

Merged
bot-backend merged 1 commit from feat/full-report-html-a into main 2026-07-03 09:52:33 +00:00
Collaborator

Что

PR-A Foundation эпика #2259 (полный PDF-экспорт отчёта). Новый PURE-модуль full_report_html.py:

  • build_full_report_html_part_a(analyze_result, cad) — §1 участок (ЕГРН/градрегламент/ЗОУИТ/gate-вердикт), §2 окружение (метро/шум/воздух/геориски/соседи), §3 сети (OSM utilities + НСПД-сооружения) + блок альтернатив программ (program_alternatives).
  • Каркас build_full_report_html(part_a, part_b?, ...) — печатный A4 с page-break-правилами WeasyPrint, титул, оглавление-якоря; part_b опционален (придёт в PR-B).
  • Карта — плейсхолдер {{MAP_PARCEL}} (подстановка в PR-C).
  • Источник — персистнутый analysis_runs.result (analyze-1.0 loose dict): всё через .get(), «нет данных» по-русски, html.escape на каждой строке payload (включая вложенные: ЗОУИТ-типы, имена соседей, blockers).
  • PURE: module-level только html/logging/typing — импорт не тянет weasyprint/БД (worker-safe, проверено diff'ом sys.modules).

Ключи payload сверены с реальным прод-раном и program_optimizer._evaluate_combo.

Осознанные решения

  • Форматтеры _as_dict/_as_list/_esc продублированы с report_pdf.py для независимости Foundation-PR — консолидация в shared-хелперы после PR-B.
  • Находка для PR-D: резервы ЦП/Водоканал/ГРС/тепло и nearby_network_zones в persist-payload ОТСУТСТВУЮТ (фронт тянет их ленивым /connection-capacity) — в PR-D дотянуть live-вызовом.

Тесты

13 passed (все секции+якоря, gate-блокеры, XSS-escape, non-dict payload, None-поля, альтернативы 3 ветки, {{MAP_PARCEL}}). ruff clean (включая UP038 из pre-commit).

Ревью

code-reviewer: APPROVE (оба minor учтены: мёртвый _kv_row_raw удалён, смешанный ключ прокомментирован).

Refs #2259

## Что PR-A Foundation эпика #2259 (полный PDF-экспорт отчёта). Новый PURE-модуль `full_report_html.py`: - `build_full_report_html_part_a(analyze_result, cad)` — §1 участок (ЕГРН/градрегламент/ЗОУИТ/gate-вердикт), §2 окружение (метро/шум/воздух/геориски/соседи), §3 сети (OSM utilities + НСПД-сооружения) + блок альтернатив программ (`program_alternatives`). - Каркас `build_full_report_html(part_a, part_b?, ...)` — печатный A4 с page-break-правилами WeasyPrint, титул, оглавление-якоря; part_b опционален (придёт в PR-B). - Карта — плейсхолдер `{{MAP_PARCEL}}` (подстановка в PR-C). - Источник — персистнутый `analysis_runs.result` (analyze-1.0 loose dict): всё через `.get()`, «нет данных» по-русски, `html.escape` на каждой строке payload (включая вложенные: ЗОУИТ-типы, имена соседей, blockers). - PURE: module-level только html/logging/typing — импорт не тянет weasyprint/БД (worker-safe, проверено diff'ом sys.modules). Ключи payload сверены с реальным прод-раном и `program_optimizer._evaluate_combo`. ## Осознанные решения - Форматтеры `_as_dict/_as_list/_esc` продублированы с `report_pdf.py` для независимости Foundation-PR — консолидация в shared-хелперы после PR-B. - **Находка для PR-D**: резервы ЦП/Водоканал/ГРС/тепло и `nearby_network_zones` в persist-payload ОТСУТСТВУЮТ (фронт тянет их ленивым `/connection-capacity`) — в PR-D дотянуть live-вызовом. ## Тесты 13 passed (все секции+якоря, gate-блокеры, XSS-escape, non-dict payload, None-поля, альтернативы 3 ветки, `{{MAP_PARCEL}}`). ruff clean (включая UP038 из pre-commit). ## Ревью code-reviewer: ✅ APPROVE (оба minor учтены: мёртвый `_kv_row_raw` удалён, смешанный ключ прокомментирован). Refs #2259
bot-backend added 1 commit 2026-07-03 09:37:07 +00:00
feat(exporters): PURE HTML-агрегатор §1-§3 + альтернативы (#2259 PR-A Foundation)
All checks were successful
CI Trade-In / changes (pull_request) Successful in 9s
CI / changes (pull_request) Successful in 9s
CI Trade-In / backend-tests (pull_request) Has been skipped
CI Trade-In / frontend-checks (pull_request) Has been skipped
CI / frontend-tests (pull_request) Has been skipped
CI / openapi-codegen-check (pull_request) Successful in 2m3s
CI / backend-tests (pull_request) Successful in 14m33s
e095a308c9
Новый full_report_html.py: build_full_report_html_part_a(analyze_result, cad)
собирает §1 участок / §2 окружение / §3 сети из персистнутого
analysis_runs.result (analyze-1.0 loose dict) + опциональный блок
program_alternatives. Каркас build_full_report_html(part_a, part_b?, ...) —
печатный A4 HTML с page-break-правилами WeasyPrint, титулом,
оглавлением-якорями; part_b опционален (PR-B). Карта — плейсхолдер
{{MAP_PARCEL}} (PR-C). Всё через .get() с graceful «нет данных»,
html.escape на всех строках payload. PURE — 13 юнит-тестов без native libs.

Форматтеры (_as_dict/_as_list/_esc) намеренно продублированы с report_pdf
для независимости Foundation-PR — консолидация в shared-хелперы позже.

NB: резервы ЦП/Водоканала + nearby_network_zones в persist-payload
ОТСУТСТВУЮТ (ленивый connection-capacity-эндпоинт) — дотянуть в PR-D.

Refs #2259
bot-backend merged commit c0c18f4ecc into main 2026-07-03 09:52:33 +00:00
bot-backend deleted branch feat/full-report-html-a 2026-07-03 09:52:33 +00:00
Sign in to join this conversation.
No reviewers
No milestone
No project
No assignees
1 participant
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#2284
No description provided.