feat(tradein/domklik): ЖК в свою колонку вместо только raw_payload #3076

Merged
lekss361 merged 1 commit from feat/domklik-newbuilding-slug into main 2026-08-24 16:04:25 +00:00
Owner

Безрисковая половина пункта 3 из #3064. Вторая половина — привязка к дому — сознательно не сделана, там развилка за тобой (разбор с замерами в issue).

Что сделано

flatComplex.slugScrapedLot.newbuilding_id — колонку, которая для идентификатора ЖК и предназначена.

Слаг, а не id: докстринг ScrapedLot задаёт формат 'federatsiya-ekaterinburg', и avito — единственный источник, который это поле реально заполняет, — кладёт туда слаг.

Миграция не нужна, колонка существует давно.

Чего здесь нет и почему

house_source / house_ext_id намеренно не трогаются.

Замер на проде: все 1351 активных domklik-листингов — вторичка, новостроек ноль. А flatComplex.id даёт 116 значений на 737 листингов (≈6.4 на ключ).

Использовать его как house_ext_id значило бы схлопнуть разные здания одного ЖК в один «дом» — и заставить якорь того же дома в оценщике сравнивать квартиры из разных корпусов. Это порча ценового механизма, а не улучшение дедупа.

Правильный ключ здания существует — domclick_building_guid: 467 значений на 619 листингов, по одному адресу на ключ. Но он приходит detail-путём, где match_or_create_house не вызывается (матчинг живёт в save_listings на SERP-пути). Это архитектурная развилка с тремя вариантами — вынесена в #3064.

Почему риск нулевой

newbuilding_id не читается бэкендом нигде — проверил grep'ом по всему tradein-mvp: только запись, COALESCE-защита в upsert и тесты. Ни одного потребителя.

На проде заполнено лишь у avito (1564 из 10287); у cian, yandex и domklik — ноль. То есть правка добавляет данные там, где сейчас пусто, и ничего не переопределяет.

Test plan

  • Фальсификация: до правки тест падает AssertionError: assert None == 'malysheva'
  • Тест стережёт границу правки: house_source и house_ext_id остаются None — если кто-то потом добавит туда привязку, тест это заметит
  • Отсутствующий flatComplex даёт None, а не пустую строку — пустая читалась бы как «ЖК есть, но безымянный», что неотличимо от настоящего ЖК с пустым слагом
  • Регрессия: 115 passed, 1 skipped (-k domclick)
  • ruff чист

Refs #3064

Безрисковая половина пункта 3 из #3064. Вторая половина — привязка к дому — **сознательно не сделана**, там развилка за тобой (разбор с замерами в issue). ## Что сделано `flatComplex.slug` → `ScrapedLot.newbuilding_id` — колонку, которая для идентификатора ЖК и предназначена. **Слаг, а не id:** докстринг `ScrapedLot` задаёт формат `'federatsiya-ekaterinburg'`, и avito — единственный источник, который это поле реально заполняет, — кладёт туда слаг. Миграция не нужна, колонка существует давно. ## Чего здесь нет и почему `house_source` / `house_ext_id` намеренно **не трогаются**. Замер на проде: все **1351** активных domklik-листингов — **вторичка**, новостроек ноль. А `flatComplex.id` даёт **116** значений на 737 листингов (≈6.4 на ключ). Использовать его как `house_ext_id` значило бы схлопнуть разные здания одного ЖК в один «дом» — и заставить **якорь того же дома в оценщике** сравнивать квартиры из разных корпусов. Это порча ценового механизма, а не улучшение дедупа. Правильный ключ здания существует — `domclick_building_guid`: **467** значений на 619 листингов, по одному адресу на ключ. Но он приходит **detail-путём**, где `match_or_create_house` не вызывается (матчинг живёт в `save_listings` на SERP-пути). Это архитектурная развилка с тремя вариантами — вынесена в #3064. ## Почему риск нулевой `newbuilding_id` **не читается бэкендом нигде** — проверил grep'ом по всему `tradein-mvp`: только запись, COALESCE-защита в upsert и тесты. Ни одного потребителя. На проде заполнено лишь у avito (1564 из 10287); у cian, yandex и domklik — **ноль**. То есть правка добавляет данные там, где сейчас пусто, и ничего не переопределяет. ## Test plan - [x] **Фальсификация:** до правки тест падает `AssertionError: assert None == 'malysheva'` - [x] Тест стережёт **границу** правки: `house_source` и `house_ext_id` остаются `None` — если кто-то потом добавит туда привязку, тест это заметит - [x] Отсутствующий `flatComplex` даёт `None`, а **не пустую строку** — пустая читалась бы как «ЖК есть, но безымянный», что неотличимо от настоящего ЖК с пустым слагом - [x] **Регрессия:** `115 passed, 1 skipped` (`-k domclick`) - [x] `ruff` чист Refs #3064
lekss361 added 1 commit 2026-08-24 15:57:36 +00:00
feat(tradein/domklik): ЖК в свою колонку вместо только raw_payload
All checks were successful
CI Trade-In / changes (pull_request) Successful in 9s
CI / changes (pull_request) Successful in 10s
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 4m39s
c137af88f5
Безрисковая половина пункта 3 из #3064. flatComplex.slug доезжает до
ScrapedLot.newbuilding_id — колонки, которая для идентификатора ЖК и
предназначена (докстринг задаёт формат «federatsiya-ekaterinburg», и
avito, единственный заполняющий её источник, кладёт туда слаг).
Поэтому slug, а НЕ id.

ЧЕГО ЗДЕСЬ НЕТ И ПОЧЕМУ. Привязка к дому (house_source/house_ext_id)
намеренно не трогается. Замер на проде: все 1351 активных
domklik-листингов — ВТОРИЧКА, новостроек ноль, а flatComplex.id даёт 116
значений на 737 листингов (~6.4 на ключ). Использовать его как
house_ext_id значило бы схлопнуть разные здания одного ЖК в один «дом» —
и заставить якорь того же дома в оценщике сравнивать квартиры из разных
корпусов. Это порча ценового механизма, а не улучшение дедупа.

Правильный ключ здания существует — domclick_building_guid, 467 значений
на 619 листингов, по одному адресу на ключ. Но он приходит detail-путём
(providers/domclick/detail.py), где match_or_create_house не вызывается,
а сам матчинг живёт в save_listings на SERP-пути. Это архитектурная
развилка с тремя вариантами, вынесена в issue — решение за владельцем,
потому что затрагивает цену.

Миграция не нужна: колонка newbuilding_id существует давно.

Риск нулевой: поле бэкендом НЕ ЧИТАЕТСЯ нигде (проверено grep'ом по
всему tradein-mvp — только запись, COALESCE-защита в upsert и тесты),
на проде заполнено лишь у avito (1564 из 10287), у cian/yandex/domklik
ноль.

Проверено:
  - фальсификация: до правки тест падает «assert None == malysheva»
  - тест стережёт и границу: house_source/house_ext_id остаются None
  - отсутствующий flatComplex даёт None, а не пустую строку (пустая
    читалась бы как «ЖК есть, но безымянный»)
  - регрессия -k domclick: 115 passed, 1 skipped
  - ruff чист

Refs #3064
lekss361 merged commit 7c916082e8 into main 2026-08-24 16:04:25 +00:00
lekss361 deleted branch feat/domklik-newbuilding-slug 2026-08-24 16:04:26 +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#3076
No description provided.