fix(tradein/pdf): МЕРА branding + 4-page report (no empty pages) #2513

Merged
lekss361 merged 2 commits from fix/tradein-pdf-mera-empty-pages into main 2026-07-13 18:04:08 +00:00
Owner

Summary

Довёл PDF-отчёт Trade-In (Mera) до ума по запросу: брендинг «МЕРА» + убраны пустые страницы (было 6 стр., стало ровно 4).

1. Брендинг «МЕРА». Дефолт-бренд generic: name «Trade-In Estimator» → «МЕРА» (brand.py). Masthead, footer и подписи секций читают brand.name → отчёт брендирован МЕРА. White-label бренды (реальное name в таблице brands) не тронуты.

2. Пустые страницы. Header (~40pt) + footer (~70pt) сидели В ПОТОКЕ каждой секции → cover переполнялся (advice-таблица уезжала на почти-пустую стр. 2), footer listings-секции сиротел на полностью пустую стр. 4. Fix — header/footer вынесены в running @page margin-boxes (position:running() + @top-center/@bottom-center): печатаются в полях каждой страницы, не занимая поток. Chrome строится один раз в generate_trade_in_pdf (не в insufficient_data-ветке); из 4 билдеров inline-вызовы убраны + очищены осиротевшие переменные; top-margin 20→25mm. Дисклеймер offer-страницы перенесён из footer в inline <p> (сохранён). Убрана дубль-строка advice на cover («до 15% при самопродаже» — детально расписана на стр. 04).

3. Баг «Год постройки None». year_built=None утекал литеральным «None» → «—» (как в остальных пустых полях).

Test plan

  • Рендер реального WeasyPrint 69 в прод-образе (ghcr.io/lekss361/gendesign-tradein-backend:latest) — визуально подтверждено: ровно 4 чистые страницы, «• МЕРА» в шапке/футере всех страниц, «Год постройки —», дисклеймер на стр. 04 на месте, наложений нет.
  • ruff check clean (pre-commit + code-reviewer).
  • pytest test_pdf_security.py 32/32, test_trade_in_pdf_dual_price.py 25/25.
  • code-reviewer: APPROVE (no blockers).
  • CI backend-tests green.
  • post-deploy: скачать PDF реальной оценки, сверить 4 страницы + МЕРА.

Follow-up (non-blocking)

_page_footer page_note-параметр стал мёртвым кодом (footer теперь single running element) — вычистить при следующем касании функции.

## Summary Довёл PDF-отчёт Trade-In (Mera) до ума по запросу: брендинг «МЕРА» + убраны пустые страницы (было 6 стр., стало **ровно 4**). **1. Брендинг «МЕРА».** Дефолт-бренд `generic`: `name` «Trade-In Estimator» → **«МЕРА»** (`brand.py`). Masthead, footer и подписи секций читают `brand.name` → отчёт брендирован МЕРА. White-label бренды (реальное `name` в таблице `brands`) не тронуты. **2. Пустые страницы.** Header (~40pt) + footer (~70pt) сидели В ПОТОКЕ каждой секции → cover переполнялся (advice-таблица уезжала на почти-пустую стр. 2), footer listings-секции сиротел на полностью пустую стр. 4. Fix — header/footer вынесены в **running `@page` margin-boxes** (`position:running()` + `@top-center`/`@bottom-center`): печатаются в полях каждой страницы, не занимая поток. Chrome строится один раз в `generate_trade_in_pdf` (не в insufficient_data-ветке); из 4 билдеров inline-вызовы убраны + очищены осиротевшие переменные; top-margin 20→25mm. Дисклеймер offer-страницы перенесён из footer в inline `<p>` (сохранён). Убрана дубль-строка advice на cover («до 15% при самопродаже» — детально расписана на стр. 04). **3. Баг «Год постройки None».** `year_built=None` утекал литеральным «None» → «—» (как в остальных пустых полях). ## Test plan - [x] Рендер реального WeasyPrint 69 в прод-образе (`ghcr.io/lekss361/gendesign-tradein-backend:latest`) — визуально подтверждено: **ровно 4 чистые страницы**, «• МЕРА» в шапке/футере всех страниц, «Год постройки —», дисклеймер на стр. 04 на месте, наложений нет. - [x] `ruff check` clean (pre-commit + code-reviewer). - [x] `pytest test_pdf_security.py` 32/32, `test_trade_in_pdf_dual_price.py` 25/25. - [x] code-reviewer: ✅ APPROVE (no blockers). - [ ] CI backend-tests green. - [ ] post-deploy: скачать PDF реальной оценки, сверить 4 страницы + МЕРА. ## Follow-up (non-blocking) `_page_footer` `page_note`-параметр стал мёртвым кодом (footer теперь single running element) — вычистить при следующем касании функции.
lekss361 added 2 commits 2026-07-13 18:02:29 +00:00
- Дефолт-бренд generic: name «Trade-In Estimator» → «МЕРА» (brand.py). Masthead/
  footer/подписи секций читают brand.name → отчёт теперь брендирован МЕРА;
  white-label бренды (реальное name в brands) не тронуты.
- Cover: year_built=None утекал литеральным «None» в «Год постройки» → «—».
- Cover: убран дубль-бар «Диапазон цен по фактическим сделкам» (уже есть на
  стр. 03) — часть ужимания cover до одной A4-страницы. Тесты обновлены.
fix(tradein/pdf): running @page header/footer → ровно 4 страницы (без пустых)
All checks were successful
CI Trade-In / frontend-checks (pull_request) Has been skipped
CI / backend-tests (pull_request) Has been skipped
CI / changes (pull_request) Successful in 8s
CI Trade-In / changes (pull_request) Successful in 9s
CI / openapi-codegen-check (pull_request) Has been skipped
CI Trade-In / backend-tests (pull_request) Successful in 59s
CI / frontend-tests (pull_request) Has been skipped
42a50cf814
Header/footer сидели В ПОТОКЕ каждой секции (~110pt/стр.) → cover переполнялся
(advice-таблица уезжала на почти-пустую стр. 2), footer listings-секции сиротел
на полностью пустую стр. 4 → отчёт 6 страниц вместо 4.

Fix: header+footer вынесены в running @page margin-boxes (position:running() +
@top-center/@bottom-center) — рендерятся в полях каждой страницы, не занимая
поток. Chrome строится ОДИН раз в generate_trade_in_pdf (else-ветка, не
insufficient_data) и оборачивается в .running-header/.running-footer; из 4
билдеров inline-вызовы header/footer убраны + очищены осиротевшие переменные.
Top-margin 20→25mm под running-header. Дисклеймер offer-страницы перенесён из
footer page_note в inline <p> (сохранён). Убрана дубль-строка advice на cover
(«до 15% при самопродаже» — детально расписана на стр. 04).

Верифицировано рендером реального WeasyPrint 69 в прод-образе: ровно 4 чистые
страницы, бренд МЕРА в шапке/футере всех страниц, «Год постройки —», дисклеймер
на месте. ruff clean; test_pdf_security 32/32; test_trade_in_pdf_dual_price 25/25.
lekss361 merged commit 987dce11bc into main 2026-07-13 18:04:08 +00:00
lekss361 deleted branch fix/tradein-pdf-mera-empty-pages 2026-07-13 18:04:08 +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#2513
No description provided.