feat(tradein/cian): promote kitchen/mortgage/apartments + normalize house_type (#2008) #2017

Merged
lekss361 merged 1 commit from feat/tradein-2008-cian-promote-house-type into main 2026-06-27 18:01:51 +00:00
Owner

Summary

CLASS A — реальный фикс оценки: cian хранил house_type сырым materialType (camelCase: monolithBrick/gasSilicateBlock/stalin/...), который ≠ канон → estimator soft-penalty ложно штрафовал ~1208 cian-аналогов (monolithBrick 1143 + прочие). Теперь normalize_house_type на ингесте (тот же модуль, что #2007) + backfill-миграция 141 существующих строк (monolithBrickmonolith_brick, gasSilicateBlock/aerocreteBlock/foamConcreteBlockblock, stalinbrick; консервативно — канон и неизвестные не трогаем).

CLASS B — promote для дашборда/матчинга (НЕ valuation, см. #2012):

  • kitchenAreakitchen_area_m2, bargainTerms.mortgageAllowedmortgage_available (колонки уже есть).
  • Новые колонки is_apartments, is_rosreestr_checked (миграция 141, ADD COLUMN IF NOT EXISTS) ← offer.isApartments / offer.isRosreestrChecked.
  • Поля добавлены в ScrapedLot + проведены через save_listings (INSERT + оба upsert-пути, COALESCE — re-scrape без поля не затирает).

Сырьё сохранено в raw_payload['raw_material_type'] / ['kitchen_area_m2'] для аудита.

Test plan

  • ruff-100 clean, no :x::type CAST trap
  • pytest: test_cian_serp_scraper + test_base_save_listings → 90 passed (расширенный прогон 202)
  • code-reviewer APPROVE (INSERT balance 60==60; миграция идемпотентна+scoped; cian-ключи сверены с прод-payload; нет регрессий для avito/yandex)
  • post-deploy (миграция 141 авто-применится strict): SELECT house_type, count(*) FROM listings WHERE source='cian' GROUP BY 1 — нет camelCase; kitchen/mortgage/apartments растут по новым cian-скрейпам

Refs #2008

## Summary **CLASS A — реальный фикс оценки:** cian хранил `house_type` сырым `materialType` (camelCase: `monolithBrick`/`gasSilicateBlock`/`stalin`/...), который ≠ канон → estimator soft-penalty ложно штрафовал ~1208 cian-аналогов (`monolithBrick` 1143 + прочие). Теперь `normalize_house_type` на ингесте (тот же модуль, что #2007) + **backfill-миграция 141** существующих строк (`monolithBrick`→`monolith_brick`, `gasSilicateBlock`/`aerocreteBlock`/`foamConcreteBlock`→`block`, `stalin`→`brick`; консервативно — канон и неизвестные не трогаем). **CLASS B — promote для дашборда/матчинга (НЕ valuation, см. #2012):** - `kitchenArea`→`kitchen_area_m2`, `bargainTerms.mortgageAllowed`→`mortgage_available` (колонки уже есть). - Новые колонки `is_apartments`, `is_rosreestr_checked` (миграция 141, `ADD COLUMN IF NOT EXISTS`) ← `offer.isApartments` / `offer.isRosreestrChecked`. - Поля добавлены в `ScrapedLot` + проведены через `save_listings` (INSERT + оба upsert-пути, COALESCE — re-scrape без поля не затирает). Сырьё сохранено в `raw_payload['raw_material_type']` / `['kitchen_area_m2']` для аудита. ## Test plan - [x] ruff-100 clean, no `:x::type` CAST trap - [x] pytest: `test_cian_serp_scraper` + `test_base_save_listings` → 90 passed (расширенный прогон 202) - [x] code-reviewer ✅ APPROVE (INSERT balance 60==60; миграция идемпотентна+scoped; cian-ключи сверены с прод-payload; нет регрессий для avito/yandex) - [ ] post-deploy (миграция 141 авто-применится strict): `SELECT house_type, count(*) FROM listings WHERE source='cian' GROUP BY 1` — нет camelCase; kitchen/mortgage/apartments растут по новым cian-скрейпам Refs #2008
lekss361 added 1 commit 2026-06-27 18:01:24 +00:00
feat(tradein/cian): promote kitchen/mortgage/apartments + normalize house_type (#2008)
All checks were successful
CI / openapi-codegen-check (pull_request) Has been skipped
CI / changes (pull_request) Successful in 7s
CI / backend-tests (pull_request) Has been skipped
CI / frontend-tests (pull_request) Has been skipped
2e44f48291
Class B (дашборд покрытия / matching, НЕ valuation — estimator их пока не читает,
follow-up #2012): cian SERP теперь промоутит kitchen_area_m2 + mortgage_available и
новые колонки is_apartments / is_rosreestr_checked из карточки в listings (раньше
лежали только в raw_payload). Проведены через save_listings обоими upsert-путями
(ON CONFLICT EXCLUDED + reconcile UPDATE) через COALESCE — re-scrape источника без
поля не затирает значение.

Class A: house_type нормализуется через общий house_type_normalizer — cian
materialType (monolithBrick / gasSilicateBlock / stalin / ...) != каноничному enum
→ estimator soft-penalty ложно штрафовал аналог. Сырой materialType сохраняется в
raw_payload['raw_material_type']. Backfill старых cian-строк — миграция 141
(idempotent, scope source='cian', только мапимые camelCase токены).
lekss361 merged commit c5227a164e into main 2026-06-27 18:01:51 +00:00
lekss361 deleted branch feat/tradein-2008-cian-promote-house-type 2026-06-27 18:01:51 +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#2017
No description provided.