feat(tradein): cian newbuilding enrichment backfill task + live-data fix (#972) #1148

Merged
bot-backend merged 1 commit from feat/newbuilding-enrich-backfill-972 into main 2026-06-07 14:09:25 +00:00
Collaborator

Что

#972 (950-E1): backfill-таска для 3 ПУСТЫХ newbuilding-enrichment таблиц (houses_price_dynamics / house_reliability_checks / house_reviews). Прогоняет существующий fetch_newbuilding+save_newbuilding_enrichment по cian-домам (ext_source='cian_newbuilding' + cian_zhk_url). Подсистема tradein-mvp (внутри репо). Non-colliding с ИРД/КРТ-треком.

2 живых бага найдено+починено (gating)

  1. save_newbuilding_enrichment падал на ЖИВЫХ cian-данныхtransportAccessibilityRate дрейфанул int → nested dictcannot adapt type 'dict' в CAST(:tar). Починка _extract_transport_rate (dict/float/bad → int|None, bool до int). Это чинит live-enrichment-краш, не только backfill — поэтому функции «прогонялись локально» раньше, но падали бы сейчас.
  2. Дубли reliability на re-run (нет UNIQUE) → dedup-guard (id DESC tiebreaker, «regardless of force» закрывает partial-resume дыру).

Идемпотентность / устойчивость

  • Skip уже-обогащённых; force-rerun dup-safe (pd UPSERT по dim_key, reviews ON CONFLICT (source,ext_review_id), reliability dedup). SAVEPOINT-per-house (одна captcha/ошибка — log+continue, батч не падает). get_scraper_delay('cian')+jitter. limit= для bounded-прогонов. Использует СВОЮ tradein-сессию.

Verify

  • code-reviewer: APPROVE — оба gate (cian-fix no-regression сверено с 20 тестами + ==7; SAVEPOINT+идемпотентность сверены с РЕАЛЬНЫМИ constraints). 8 новых тестов + isolated-DB proof-run (pd 0→6, reliability 0→1, идемпотентность доказана 3× re-run). Полный tradein-suite 359 pass (1 pre-existing-unrelated fail), ruff чисто. cian достижим из dev (1 fetch → 200, без captcha).

Остаётся (не в этом PR)

  • Полный 283-прогон — отдельная prod-data операция (bounded limit=5 proof на проде → потом full, ~25-30мин), сделаю осторожно после merge.
  • house_reviews ~0: cian-отзывы в отдельном XHR (не в initialState) → расширение fetch_newbuilding = follow-up.

Refs #972.

## Что #972 (950-E1): backfill-таска для 3 ПУСТЫХ newbuilding-enrichment таблиц (`houses_price_dynamics` / `house_reliability_checks` / `house_reviews`). Прогоняет существующий `fetch_newbuilding`+`save_newbuilding_enrichment` по cian-домам (`ext_source='cian_newbuilding'` + `cian_zhk_url`). Подсистема tradein-mvp (внутри репо). Non-colliding с ИРД/КРТ-треком. ## 2 живых бага найдено+починено (gating) 1. **`save_newbuilding_enrichment` падал на ЖИВЫХ cian-данных** — `transportAccessibilityRate` дрейфанул `int → nested dict` → `cannot adapt type 'dict'` в `CAST(:tar)`. Починка `_extract_transport_rate` (dict/float/bad → `int|None`, bool до int). **Это чинит live-enrichment-краш, не только backfill** — поэтому функции «прогонялись локально» раньше, но падали бы сейчас. 2. **Дубли reliability на re-run** (нет UNIQUE) → dedup-guard (`id DESC` tiebreaker, «regardless of force» закрывает partial-resume дыру). ## Идемпотентность / устойчивость - Skip уже-обогащённых; force-rerun dup-safe (pd UPSERT по `dim_key`, reviews `ON CONFLICT (source,ext_review_id)`, reliability dedup). SAVEPOINT-per-house (одна captcha/ошибка — log+continue, батч не падает). `get_scraper_delay('cian')`+jitter. `limit=` для bounded-прогонов. Использует СВОЮ tradein-сессию. ## Verify - `code-reviewer`: ✅ APPROVE — оба gate (cian-fix no-regression сверено с 20 тестами + `==7`; SAVEPOINT+идемпотентность сверены с РЕАЛЬНЫМИ constraints). 8 новых тестов + isolated-DB proof-run (pd 0→6, reliability 0→1, идемпотентность доказана 3× re-run). Полный tradein-suite 359 pass (1 pre-existing-unrelated fail), ruff чисто. cian достижим из dev (1 fetch → 200, без captcha). ## Остаётся (не в этом PR) - **Полный 283-прогон** — отдельная prod-data операция (bounded limit=5 proof на проде → потом full, ~25-30мин), сделаю осторожно после merge. - **house_reviews** ~0: cian-отзывы в отдельном XHR (не в initialState) → расширение `fetch_newbuilding` = follow-up. Refs #972.
bot-backend added the
scope/backend
scrapers
GG-форсайт
site-finder
labels 2026-06-07 14:09:22 +00:00
bot-backend added 1 commit 2026-06-07 14:09:22 +00:00
feat(tradein): backfill task for cian newbuilding enrichment (#972)
All checks were successful
CI / changes (push) Successful in 7s
CI / backend-tests (push) Has been skipped
CI / frontend-tests (push) Has been skipped
CI / backend-tests (pull_request) Has been skipped
CI / frontend-tests (pull_request) Has been skipped
CI / changes (pull_request) Successful in 6s
98020e418b
950-E1: app/tasks/newbuilding_enrich_backfill.py selects houses linked to
ext_source='cian_newbuilding' with a fetchable cian_zhk_url and runs the existing
fetch_newbuilding + save_newbuilding_enrichment over each, populating
houses_price_dynamics + house_reliability_checks (+ house_reviews when present).

- Idempotent + resumable: skips already-enriched houses; force= re-run dup-safe
  (price_dynamics UPSERT via dim_key, reliability dedup guard with id-DESC
  tiebreaker, reviews ON CONFLICT (source,ext_review_id)).
- Anti-bot aware: get_scraper_delay('cian') + jitter, SAVEPOINT-per-house
  (one captcha/failure logs + continues, never aborts the batch).
- limit= for bounded proof runs; sizing counters (total/fetchable/pending).

Fix cian_newbuilding._extract_transport_rate: cian transportAccessibilityRate
drifted to a nested dict and broke save_newbuilding_enrichment's CAST bind on
LIVE data (cannot adapt type 'dict') — coerce dict/float/bad -> int|None
(bool excluded before int). Fixes the live enrichment crash, not just backfill.

house_reviews stays ~0 for now: cian reviews are in a separate XHR, not the ЖК
initialState — extending fetch_newbuilding for them is a documented follow-up.

Tested: 8 new unit tests; isolated-DB proof-run landed 6 price_dynamics + 1
reliability row, idempotency proven across re-runs. Refs #972.
bot-backend merged commit bcb1285341 into main 2026-06-07 14:09:25 +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#1148
No description provided.