fix(tradein/cian): читать bti из offerData — BTI-персист в houses писал ноль строк (#2435) #2668
No reviewers
Labels
No labels
Fable 5 ревью
GG-форсайт
admin
analytics
auth
automation
bug
business
chore
ci
compliance
data
data-moat
docs
duplicate
dx
enhancement
feedback/max
generative
needs-discussion
needs-human
observability
pause-bots
performance
priority/p0
priority/p1
priority/p2
priority/p3
scope/backend
scope/db
scope/devops
scope/frontend
scope/qa
scrapers
security
site-finder
stage/1
stage/2
status/blocked
status/done
status/needs-analysis
status/needs-fix
status/qa
status/ready
status/review
status/wip
tech-debt
tradein
ux
week ревью 1
wontfix
ИРД
вторичка
No milestone
No project
No assignees
1 participant
Notifications
Due date
No due date set.
Dependencies
No dependencies set.
Reference: lekss361/gendesign#2668
Loading…
Add table
Reference in a new issue
No description provided.
Delete branch "feat/2435-cian-house-enrichment"
Deleting a branch is permanent. Although the deleted branch may continue to exist for a short time before it actually gets removed, it CANNOT be undone in most cases. Continue?
Что было
#2435 уже был реализован и смержен — PR #2437 (04.07):
bti_dataпишется вhousesчерезmatch_or_create_house, valuationhouse_info/management_company/external_house_idдоходят до дома, 11 тестов, 4 call-site'а прокидывают matcher. Issue осталась открытой (Refs, неCloses).При прод-проверке выяснилось, что записи не появилось ни одной:
series_name/entrances/flat_count/is_emergency/heat_supply_type/gas_supply_type/overlap_typehouse_id_fk(дом резолвится)Колонки на месте — утверждение issue подтверждено, миграция не нужна.
Причина
btiчитался только как ключ, соседний сdefaultStateвнутри контейнераfrontend-offer-card. Cian отдаёт его внутриdefaultState—offerData.bti.extract_all_states()на реальной странице возвращает 143 ключа,btiсреди них нет →bti_dataвсегдаNone→ весь write-path #2435 мёртв.Проверено офлайн на сохранённом реальном HTML (
fixtures/cian_flat_330982715.html), без обращения к площадке:Почему не поймали тестами: все 11 тестов #2435 кормят
bti_dataнапрямую вsave_detail_enrichment, минуяfetch_detail— персист покрыт, извлечение нет.Что стало
bti_state = offer_data.get("bti") or offer_card_states.get("bti")— старое место оставлено фоллбэком. Плюс поправлен докстринг модуля, который и утверждал неверное («sister containers in same _cianConfig»).Новый тест гоняет реальный сохранённый HTML через настоящий
fetch_detail(мокbrowser_fetcher, сети нет) и проверяет, чтоbti_dataзаполнен ожидаемыми полями; второй тест закрепляет фоллбэк.Охват
Потолок — 5188 домов, которых касались Cian-объявления (сейчас у них 4153 без
house_type, 1337 безtotal_floors, 444 безyear_built). Реально обогатится меньше и не сразу: BTI отдаётся только по вторичке, и заполнение идёт по мере повторных detail-проходов. Прямо сейчас Cian detail-обогащение стоит с 22.07 — до его возобновления эффекта на проде не будет.Это полнота карточки дома, не точность оценки — оценщик эти поля не использует.
Что НЕ входит
external_valuationsдляcian_valuation— 139 строк, все сhouse_id IS NULL, последний fetch 29.06, то есть до мержа #2437;management_companiesпуста (0 строк). Код выглядит корректно (estimator передаётhouse_id=target_house_id), но ни разу не исполнялся после фикса. Почему прекратились cian_valuation-фетчи — отдельный вопрос, не трогал.listings.views_total— NULL у всех 21 682 Cian-листингов. Тот же класс («распарсили и потеряли»), но другое поле и другая причина:stats.totalViewsFormattedString="146 просмотров, 8 за сегодня", а_parse_views()делаетint(...)после срезания пробелов → всегдаValueError→None. Вне scope #2435, стоит отдельной issue.cian_price_history.py:save_detail_enrichmentвызывается только когдаprice_changesнепустой — оффер с BTI, но без изменений цены, BTI теряет. Сейчас последствий нет (626 из 628 имели price-history), менять семантику джобы в этом PR не стал.yearRelease/houseMaterialType/floorMaxиз BTI по-прежнему не пишутся — так было решено в #2437, не расширял.Test plan
test_cian_bti_house_persist.py+test_cian_state_parser.py+test_pipeline_browser_routing.py+test_cian_city_sweep.py+test_cian_history_backfill_listings_rollback.py— 44 passedtest_fetch_detail_extracts_bti_from_offer_data_on_real_pageкраснеет (bti_data is None); 11 старых тестов #2435 остаются зелёными — та самая слепая зонаSELECT count(entrances) FROM housesдолжен стать > 0Refs #2435