feat(export): DOCX export of §22 forecast report — slice #959 #1110

Merged
bot-backend merged 1 commit from feat/forecast-export-docx-959 into main 2026-06-07 08:58:12 +00:00
Collaborator

Что

DOCX-формат экспорта §22-отчёта — завершает форматы EPIC #959 (PDF/XLSX/MD/JSON/TG ✓ → +DOCX). Формальный Word-отчёт для ГГ/клиентов.

Относится к #959.

Содержимое

  • exporters/report_docx.pyrender_report_docx(report) -> bytes (python-docx). DRY: переиспользует pure-хелперы из report_pdf. Зеркалит порядок/контент report_md (8 секций + advisory). Graceful на тонком/пустом (валидный минимальный .docx). Локальный import docx (как WeasyPrint).
  • GET /{cad}/forecast/export?format=docx → Word-attachment (…wordprocessingml.document). md/json/tg без изменений; нет рана → 404; невалидный format → 422.
  • Зависимость: python-docx>=1.1.0 в pyproject + uv.lock регенерирован. uv sync --frozen проходит (deploy-abort guard). lxml — manylinux-wheel, Dockerfile не трогаем.

Качество

  • code-reviewer: APPROVE — lock-gate проверен ревьюером лично (uv sync --frozen EXIT 0, минимальный scope python-docx+lxml), renderer graceful+DRY, endpoint без регрессии, ruff clean. 17 docx-тестов (998 passed). #1032 CI-гейт дополнительно проверит lock.

Тест-план (post-deploy)

GET /api/v1/parcels/66:41:0702048:27/forecast/export?format=docx → 200 Word-документ (PK-сигнатура), открывается в Word/LibreOffice.

## Что DOCX-формат экспорта §22-отчёта — завершает форматы EPIC **#959** (PDF/XLSX/MD/JSON/TG ✓ → +DOCX). Формальный Word-отчёт для ГГ/клиентов. Относится к #959. ## Содержимое - `exporters/report_docx.py` — `render_report_docx(report) -> bytes` (python-docx). DRY: переиспользует pure-хелперы из `report_pdf`. Зеркалит порядок/контент `report_md` (8 секций + advisory). Graceful на тонком/пустом (валидный минимальный .docx). Локальный `import docx` (как WeasyPrint). - `GET /{cad}/forecast/export?format=docx` → Word-attachment (`…wordprocessingml.document`). md/json/tg без изменений; нет рана → 404; невалидный format → 422. - **Зависимость:** `python-docx>=1.1.0` в pyproject + `uv.lock` регенерирован. `uv sync --frozen` проходит (deploy-abort guard). lxml — manylinux-wheel, Dockerfile не трогаем. ## Качество - `code-reviewer`: ✅ APPROVE — **lock-gate проверен ревьюером лично** (`uv sync --frozen` EXIT 0, минимальный scope python-docx+lxml), renderer graceful+DRY, endpoint без регрессии, ruff clean. 17 docx-тестов (998 passed). #1032 CI-гейт дополнительно проверит lock. ## Тест-план (post-deploy) `GET /api/v1/parcels/66:41:0702048:27/forecast/export?format=docx` → 200 Word-документ (PK-сигнатура), открывается в Word/LibreOffice.
bot-backend added the
scope/backend
GG-форсайт
site-finder
labels 2026-06-07 08:58:08 +00:00
bot-backend added 1 commit 2026-06-07 08:58:09 +00:00
feat(export): add DOCX export of §22 forecast report (#959)
All checks were successful
CI / changes (push) Successful in 7s
CI / changes (pull_request) Successful in 6s
CI / backend-tests (push) Has been skipped
Deploy / changes (push) Successful in 6s
Deploy / build-frontend (push) Has been skipped
Deploy / build-backend (push) Successful in 2m49s
Deploy / build-worker (push) Successful in 3m27s
Deploy / deploy (push) Successful in 1m13s
CI / backend-tests (pull_request) Successful in 6m4s
3a89287c6b
render_report_docx (python-docx) mirrors report_md/report_pdf section order &
content, reuses report_pdf pure helpers (DRY), graceful on thin/empty report.
Widen /forecast/export format Literal to include docx → Word attachment.
Add python-docx dep + regenerate uv.lock (uv sync --frozen passes). Part of #959.
bot-backend merged commit 3a89287c6b into main 2026-06-07 08:58:12 +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#1110
No description provided.