feat(exporters): DOCX-вариант полного отчёта ПТИЦА (#2259 R2) #2301

Merged
bot-backend merged 1 commit from feat/full-report-docx into main 2026-07-03 20:21:19 +00:00
Collaborator

Что

R2 эпика #2259 (PR-F из плана): полный отчёт §1–§7 в Word — «один файл инвесткомитету» теперь в обоих форматах.

  • build_full_report_docx: python-docx документ, зеркалящий PDF-структуру (§1–§7 + альтернативы) из тех же исходных словарей — HTML не парсится, переиспользуются PURE-хелперы full_report_html (числа PDF и DOCX совпадают by construction: тот же кап/фильтр областного шума, схлопывание корпусов, ЗОУИТ-резолв, деградации). Карты — те же PNG через add_picture (плашка при None/битом).
  • Оркестратор: DOCX рендерится после PDF из уже готовых карт-PNG (не дважды), пишется общим _atomic_write; порядок render→write→метадата — упавший DOCX не оставляет ран с битой ссылкой. Метадата +docx_path/docx_size_bytes; кэш-схема не сломана.
  • GET /report/download?format=pdf|docx (Literal, default pdf; битый → 422; путь строго из метадаты). Legacy-раны без docx → 404 «пересоберите отчёт».
  • python-docx — только локальные импорты (web-процесс native не тянет, проверено транзитивно); зависимость уже в pyproject/uv.lock (#959).
  • api-types.ts регенерён (+12/−4, только query-параметр).

Тесты

198 passed / 6 skipped (16 новых DOCX: PK-magic + Document round-trip, все секции, карты/плашки/битый PNG, деградации вплоть до {}; +5 endpoint: docx-200/default-pdf/legacy-404/missing-file-404/invalid-422). DOCX-тесты без skip (native не нужен). ruff+UP (пиненный 0.7.4) clean.

Ревью

code-reviewer: APPROVE (импорт-граница web/worker, атомарность и порядок записи, отсутствие circular — проверены).

Post-deploy

qa: download?format=docx на свежепересобранном отчёте (unit-тесты мокают файловый слой — e2e через Celery+volume проверяется на проде).

Refs #2259

## Что R2 эпика #2259 (PR-F из плана): полный отчёт §1–§7 в Word — «один файл инвесткомитету» теперь в обоих форматах. - **`build_full_report_docx`**: python-docx документ, зеркалящий PDF-структуру (§1–§7 + альтернативы) из **тех же исходных словарей** — HTML не парсится, переиспользуются PURE-хелперы `full_report_html` (числа PDF и DOCX совпадают by construction: тот же кап/фильтр областного шума, схлопывание корпусов, ЗОУИТ-резолв, деградации). Карты — те же PNG через `add_picture` (плашка при None/битом). - **Оркестратор**: DOCX рендерится после PDF из уже готовых карт-PNG (не дважды), пишется общим `_atomic_write`; порядок render→write→метадата — упавший DOCX не оставляет ран с битой ссылкой. Метадата +`docx_path`/`docx_size_bytes`; кэш-схема не сломана. - **`GET /report/download?format=pdf|docx`** (Literal, default pdf; битый → 422; путь строго из метадаты). Legacy-раны без docx → 404 «пересоберите отчёт». - python-docx — только локальные импорты (web-процесс native не тянет, проверено транзитивно); зависимость уже в pyproject/uv.lock (#959). - `api-types.ts` регенерён (+12/−4, только query-параметр). ## Тесты 198 passed / 6 skipped (16 новых DOCX: PK-magic + Document round-trip, все секции, карты/плашки/битый PNG, деградации вплоть до `{}`; +5 endpoint: docx-200/default-pdf/legacy-404/missing-file-404/invalid-422). DOCX-тесты без skip (native не нужен). ruff+UP (пиненный 0.7.4) clean. ## Ревью code-reviewer: ✅ APPROVE (импорт-граница web/worker, атомарность и порядок записи, отсутствие circular — проверены). ## Post-deploy qa: `download?format=docx` на свежепересобранном отчёте (unit-тесты мокают файловый слой — e2e через Celery+volume проверяется на проде). Refs #2259
bot-backend added 1 commit 2026-07-03 20:05:01 +00:00
feat(exporters): DOCX-вариант полного отчёта ПТИЦА (#2259 R2)
All checks were successful
CI Trade-In / changes (pull_request) Successful in 9s
CI / changes (pull_request) Successful in 8s
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) Successful in 1m25s
CI / openapi-codegen-check (pull_request) Successful in 2m37s
CI / backend-tests (pull_request) Successful in 15m23s
1ed4104105
build_full_report_docx зеркалит PDF §1-§7 + альтернативы из ТЕХ ЖЕ
исходных словарей (HTML не парсит; переиспользует PURE-хелперы
full_report_html — числа PDF и DOCX совпадают by construction) с картами
через add_picture (плашка при отсутствии/битом PNG). python-docx —
только локальные импорты: web-процесс native не тянет.

build_full_report пишет .docx рядом с PDF (те же карт-PNG, общий
_atomic_write tmp+replace); порядок render→write→метадата: упавший DOCX
не оставляет ран-сироту. Метадата +docx_path/docx_size_bytes.

GET /report/download?format=pdf|docx (Literal, default pdf; путь строго
из метадаты); legacy-раны без docx → 404 «пересоберите отчёт».
api-types регенерён (+12/−4, query-параметр).

Refs #2259
bot-backend merged commit c129515ab8 into main 2026-07-03 20:21:19 +00:00
bot-backend deleted branch feat/full-report-docx 2026-07-03 20:21:20 +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#2301
No description provided.