fix(tradein/scraper-kit): mirror numberless None-guards in avito houses provider copy
This commit is contained in:
parent
0eb033d77d
commit
e84b6e553a
1 changed files with 38 additions and 4 deletions
|
|
@ -919,10 +919,11 @@ async def fetch_house_catalog(
|
||||||
# ---------------------------------------------------------------------------
|
# ---------------------------------------------------------------------------
|
||||||
|
|
||||||
|
|
||||||
def upsert_house(db: Session, h: HouseInfo, *, matcher: HouseMatcher) -> int:
|
def upsert_house(db: Session, h: HouseInfo, *, matcher: HouseMatcher) -> int | None:
|
||||||
"""Match-or-create канонический дом через matcher, затем обновить enrichment.
|
"""Match-or-create канонический дом через matcher, затем обновить enrichment.
|
||||||
|
|
||||||
Source='avito'. Возвращает houses.id.
|
Source='avito'. Возвращает houses.id, либо None если matcher отказал (P1:
|
||||||
|
безномерный адрес без кадастра, method='no_house_number').
|
||||||
Делегирует в _persist_house (без url — url пуст как раньше для этого пути).
|
Делегирует в _persist_house (без url — url пуст как раньше для этого пути).
|
||||||
`matcher` — инжектируемый `HouseMatcher` (scraper_kit.contracts, #2133) вместо
|
`matcher` — инжектируемый `HouseMatcher` (scraper_kit.contracts, #2133) вместо
|
||||||
прямого импорта app.services.matching.houses.match_or_create_house.
|
прямого импорта app.services.matching.houses.match_or_create_house.
|
||||||
|
|
@ -941,15 +942,18 @@ def upsert_house(db: Session, h: HouseInfo, *, matcher: HouseMatcher) -> int:
|
||||||
|
|
||||||
def _upsert_house_with_url(
|
def _upsert_house_with_url(
|
||||||
db: Session, h: HouseInfo, house_url: str, *, matcher: HouseMatcher
|
db: Session, h: HouseInfo, house_url: str, *, matcher: HouseMatcher
|
||||||
) -> int:
|
) -> int | None:
|
||||||
"""Внутренний вариант upsert_house с правильным URL.
|
"""Внутренний вариант upsert_house с правильным URL.
|
||||||
|
|
||||||
Делегирует в _persist_house — используй его вместо прямого вызова.
|
Делегирует в _persist_house — используй его вместо прямого вызова.
|
||||||
|
Возвращает None если matcher отказал (P1 numberless без кадастра).
|
||||||
"""
|
"""
|
||||||
return _persist_house(db, h, house_url, matcher=matcher)
|
return _persist_house(db, h, house_url, matcher=matcher)
|
||||||
|
|
||||||
|
|
||||||
def _persist_house(db: Session, h: HouseInfo, house_url: str, *, matcher: HouseMatcher) -> int:
|
def _persist_house(
|
||||||
|
db: Session, h: HouseInfo, house_url: str, *, matcher: HouseMatcher
|
||||||
|
) -> int | None:
|
||||||
"""Канонический путь сохранения дома-avito через match_or_create_house.
|
"""Канонический путь сохранения дома-avito через match_or_create_house.
|
||||||
|
|
||||||
Шаги:
|
Шаги:
|
||||||
|
|
@ -978,6 +982,17 @@ def _persist_house(db: Session, h: HouseInfo, house_url: str, *, matcher: HouseM
|
||||||
source_url=house_url or None,
|
source_url=house_url or None,
|
||||||
)
|
)
|
||||||
|
|
||||||
|
# P1: matcher refuses a numberless address without a cadastral number
|
||||||
|
# (method 'no_house_number' → house_id None). No canonical row exists to enrich,
|
||||||
|
# so skip the UPDATE and signal the graceful skip up to save_house_catalog_enrichment.
|
||||||
|
if house_id is None:
|
||||||
|
logger.info(
|
||||||
|
"_persist_house: skip numberless avito house ext_id=%s addr=%r (no cadastral)",
|
||||||
|
h.ext_id,
|
||||||
|
h.short_address or h.full_address,
|
||||||
|
)
|
||||||
|
return None
|
||||||
|
|
||||||
db.execute(
|
db.execute(
|
||||||
text("""
|
text("""
|
||||||
UPDATE houses SET
|
UPDATE houses SET
|
||||||
|
|
@ -1281,6 +1296,25 @@ def save_house_catalog_enrichment(
|
||||||
}
|
}
|
||||||
house_id = _upsert_house_with_url(db, e.house, e.house_url, matcher=matcher)
|
house_id = _upsert_house_with_url(db, e.house, e.house_url, matcher=matcher)
|
||||||
|
|
||||||
|
# P1: matcher refused to create a canonical house for a numberless address without a
|
||||||
|
# cadastral number (house_id None). Downstream saves (reviews / placement history) are
|
||||||
|
# house-scoped and meaningless with a NULL house_id, so graceful-skip the whole
|
||||||
|
# enrichment — same zero-counter contract as the id-less guard above.
|
||||||
|
if house_id is None:
|
||||||
|
logger.warning(
|
||||||
|
"save_house_catalog_enrichment: пропуск дома с безномерным адресом без кадастра"
|
||||||
|
" (ext_id=%s addr=%r) — matcher вернул no_house_number",
|
||||||
|
e.house.ext_id,
|
||||||
|
e.house.short_address or e.house.full_address,
|
||||||
|
)
|
||||||
|
return {
|
||||||
|
"house_id": 0,
|
||||||
|
"reviews": 0,
|
||||||
|
"sellers": 0,
|
||||||
|
"listings_linked": 0,
|
||||||
|
"placement_history": 0,
|
||||||
|
}
|
||||||
|
|
||||||
# 2. Сохранить отзывы
|
# 2. Сохранить отзывы
|
||||||
reviews_count = save_house_reviews(db, house_id, e.reviews)
|
reviews_count = save_house_reviews(db, house_id, e.reviews)
|
||||||
|
|
||||||
|
|
|
||||||
Loading…
Add table
Reference in a new issue