SPB Git forge

spb/immo-ka

Public

Immo-Ka — agrégateur des propriétés à vendre au Québec (73 connecteurs, ~40 000 annonces, React+FastAPI)

112commits 1branches 0releases
125.4 MBsize
maindefault branch
13 days agolast push
Python 47.5% HTML 27.9% TypeScript 15.5% CSS 7.2% JavaScript 2%

vraiprix_local : réparation set-based des replis rôle dans enrich_role

Filet de sécurité idempotent : ré-applique year_built/lot_sqft depuis le JSON
vraiprix (annee_construction_role / superficie_terrain_role_m2) si une mise à
jour de source les a remis à NULL (anciens process sans COALESCE). Récupéré au
premier passage : 246 années + 1 920 terrains.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Simon-Pierre Boucher committed 1 mo ago (Aug 18, 2026) parent e9bc9d7

1 changed file +28 −1

modified immoka/vraiprix_local.py +28 −1
@@ -402,9 +402,36 @@ def enrich_role(limit: int | None = None) -> dict:
402 402 pass
403 403 time.sleep(1.0)
404 404 con.commit()
405 + # réparation set-based (idempotente, instantanée) : ré-applique le repli de
406 + # colonnes depuis le JSON vraiprix déjà enrichi — filet de sécurité si une
407 + # mise à jour de source a écrasé year_built/lot_sqft (anciens process sans
408 + # COALESCE, edge cases de course entre writer et backfill).
409 + cur = con.execute(
410 + "UPDATE listings SET"
411 + " year_built=CAST(json_extract(vraiprix,'$.annee_construction_role') AS INT),"
412 + " details=json_set(COALESCE(details,'{}'),'$.year_built_source','role')"
413 + " WHERE active=1 AND year_built IS NULL"
414 + " AND CAST(json_extract(vraiprix,'$.annee_construction_role') AS INT)"
415 + " BETWEEN 1600 AND 2049")
416 + repaired_y = cur.rowcount
417 + like_condo = ("lower(property_type) LIKE '%condo%'"
418 + " OR lower(property_type) LIKE '%appartement%'"
419 + " OR lower(property_type) LIKE '%loft%'"
420 + " OR lower(property_type) LIKE '%copropri%'")
421 + cur = con.execute(
422 + "UPDATE listings SET"
423 + " lot_sqft=ROUND(CAST(json_extract(vraiprix,'$.superficie_terrain_role_m2')"
424 + " AS REAL) * 10.7639),"
425 + " details=json_set(COALESCE(details,'{}'),'$.lot_sqft_source','role')"
426 + " WHERE active=1 AND lot_sqft IS NULL"
427 + " AND CAST(json_extract(vraiprix,'$.superficie_terrain_role_m2') AS REAL) > 0"
428 + f" AND NOT ({like_condo})")
429 + repaired_l = cur.rowcount
430 + con.commit()
405 431 con.close()
406 432 vp.close()
407 433 out = {"role_enriched": enriched, "year_built_filled": fallback_y,
408 − "lot_filled": fallback_l}
434 + "lot_filled": fallback_l, "repaired_year": repaired_y,
435 + "repaired_lot": repaired_l}
409 436 print(f"[immo-ka] vraiprix_local.enrich_role {out}")
410 437 return out
411 438