Безрисковая половина пункта 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