fix(tradein/pdf): клиентский PDF не называет площадки-источники — «Источник N», как в веб-отчёте (#3341) #3344

Merged
lekss361 merged 1 commit from fix/3341-pdf-public-source-labels into main 2026-09-03 09:04:52 +00:00
Owner

Закрывает #3341.

Что

Веб-отчёт и лендинг с #3342 не показывают названия площадок (канон publicLabel в frontend/src/lib/source-registry.ts), а клиентский PDF по тому же /estimate/{id} печатал Avito / Циан / «Домклик · Сбер» / Я.Недвижимость / Этажи в пилюлях источников, «подтверждают Росреестр, ДомКлик…» в советах и «на Циан, Авито, Я.Недвижимости» в тарифах. Замер на проде (последняя оценка, 4 страницы): «Домклик» ×5, «Авито», «Циан», «Я.Недвижимость».

  • _SOURCE_DISPLAY_NAMES → публичные лейблы 1:1 с реестром фронта; fallback «Другой источник» вместо source.title() (сырой id — та же утечка).
  • Алиасы (avito_imv, cian_valuation, yandex_valuation, domclick, etagi) канонизируются до выбора цвета и лейбла; списки источников на страницах объявлений и сделок дедуплицируются до среза [:5]. Без этого sources_used = listing ∪ valuation давал «Источник 1, Источник 1, Источник 2, Источник 2, Источник 4» с серой точкой у алиасов и вытеснял yandex — нашло ревью.
  • Цвета пилюль не тронуты: цвет — опознаватель, как на вебе.
  • Тексты: «Росреестр, сделки площадок и продажи агентств», «на основных площадках объявлений».
  • Гейт tests/test_pdf_public_source_labels.py: видимый текст страниц без названий площадок и сырых id, по кейсу на имя; дедуп алиасов; ветка совета с процентом.

Ревью

Workflow 3 линзы × 3 опровергателя (24 агента) + code-reviewer (APPROVE). Не сделано: «Другой источник» в узкой колонке таблицы примеров может переноситься на две строки для исторических id (n1) — косметика, отдельно если понадобится.

Проверки

ruff check / ruff format --check — чисто; pytest tests/test_pdf_public_source_labels.py tests/test_pdf_security.py tests/test_pdf_real_render.py — 82 passed, 1 skipped (real-render без WeasyPrint локально, штатно).

После деплоя повторю замер PDF на проде тем же способом.

🤖 Generated with Claude Code

https://claude.ai/code/session_01F7jNyTNUDswvvhkyqyyJtH

Закрывает #3341. ## Что Веб-отчёт и лендинг с #3342 не показывают названия площадок (канон `publicLabel` в `frontend/src/lib/source-registry.ts`), а клиентский PDF по тому же `/estimate/{id}` печатал Avito / Циан / «Домклик · Сбер» / Я.Недвижимость / Этажи в пилюлях источников, «подтверждают Росреестр, ДомКлик…» в советах и «на Циан, Авито, Я.Недвижимости» в тарифах. Замер на проде (последняя оценка, 4 страницы): «Домклик» ×5, «Авито», «Циан», «Я.Недвижимость». - `_SOURCE_DISPLAY_NAMES` → публичные лейблы 1:1 с реестром фронта; fallback «Другой источник» вместо `source.title()` (сырой id — та же утечка). - Алиасы (`avito_imv`, `cian_valuation`, `yandex_valuation`, `domclick`, `etagi`) канонизируются до выбора цвета и лейбла; списки источников на страницах объявлений и сделок дедуплицируются до среза `[:5]`. Без этого `sources_used` = listing ∪ valuation давал «Источник 1, Источник 1, Источник 2, Источник 2, Источник 4» с серой точкой у алиасов и вытеснял yandex — нашло ревью. - Цвета пилюль не тронуты: цвет — опознаватель, как на вебе. - Тексты: «Росреестр, сделки площадок и продажи агентств», «на основных площадках объявлений». - Гейт `tests/test_pdf_public_source_labels.py`: видимый текст страниц без названий площадок и сырых id, по кейсу на имя; дедуп алиасов; ветка совета с процентом. ## Ревью Workflow 3 линзы × 3 опровергателя (24 агента) + `code-reviewer` (APPROVE). Не сделано: «Другой источник» в узкой колонке таблицы примеров может переноситься на две строки для исторических id (`n1`) — косметика, отдельно если понадобится. ## Проверки `ruff check` / `ruff format --check` — чисто; `pytest tests/test_pdf_public_source_labels.py tests/test_pdf_security.py tests/test_pdf_real_render.py` — 82 passed, 1 skipped (real-render без WeasyPrint локально, штатно). После деплоя повторю замер PDF на проде тем же способом. 🤖 Generated with [Claude Code](https://claude.com/claude-code) https://claude.ai/code/session_01F7jNyTNUDswvvhkyqyyJtH
lekss361 added 1 commit 2026-09-03 08:59:06 +00:00
fix(tradein/pdf): клиентский PDF не называет площадки-источники — «Источник N», как в веб-отчёте (#3341)
All checks were successful
CI Trade-In / changes (pull_request) Successful in 8s
CI / changes (pull_request) Successful in 11s
CI Trade-In / browser-tests (pull_request) Has been skipped
CI Trade-In / frontend-checks (pull_request) Has been skipped
CI / backend-tests (pull_request) Has been skipped
CI / frontend-tests (pull_request) Has been skipped
CI / openapi-codegen-check (pull_request) Has been skipped
CI Trade-In / backend-tests (pull_request) Successful in 5m7s
f2f9ac941b
Веб-отчёт и лендинг с #3342 не показывают названия площадок (канон publicLabel в
frontend/src/lib/source-registry.ts), а клиентский PDF по тому же /estimate/{id}
печатал Avito / Циан / «Домклик · Сбер» / Я.Недвижимость / Этажи в пилюлях
источников, «подтверждают Росреестр, ДомКлик…» в советах и «на Циан, Авито,
Я.Недвижимости» в тарифах. Один клиент — два документа с разной нормой, и юр-риск,
ради которого всё делалось, в PDF оставался открытым.

- `_SOURCE_DISPLAY_NAMES` → публичные лейблы 1:1 с реестром фронта: avito → «Источник 1»,
  cian → 2, yandex → 3, domklik → 4, etazhi → 5, rosreestr → «Росреестр»; fallback для
  незнакомого id — «Другой источник», а не `source.title()` (сырой id — та же утечка).
- Алиасы (avito_imv, cian_valuation, yandex_valuation, domclick, etagi) канонизируются
  ДО выбора цвета и лейбла (`_canonical_source`), а списки источников на страницах
  объявлений и сделок дедуплицируются до среза [:5] (`_public_sources`): иначе
  `sources_used` = listing ∪ valuation давал «Источник 1, Источник 1, Источник 2,
  Источник 2, Источник 4» с серой точкой у алиасов и вытеснял yandex.
- Цвета пилюль не тронуты: цвет — опознаватель источника, как на вебе.
- Тексты: «Росреестр, сделки площадок и продажи агентств», «на основных площадках
  объявлений» (двойник offer-rates.ts).
- Гейт `tests/test_pdf_public_source_labels.py`: видимый текст страниц (без тегов и
  атрибутов, href на домены площадок законны) не содержит названий площадок и сырых
  id, по одному кейсу на имя; дедуп алиасов; ветка совета с процентом.

Не тронуто: ссылки на объявления (avito.ru/domclick.ru) — отдельное решение;
`_QUALITY_SOURCE_SLOTS` — только счётчик, имена не рендерит.
lekss361 merged commit 9cb5bf3fa3 into main 2026-09-03 09:04:52 +00:00
lekss361 deleted branch fix/3341-pdf-public-source-labels 2026-09-03 09:04:52 +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#3344
No description provided.