fix(tradein/domklik): убрать вывод is_pro_seller — колонка уже перегружена
All checks were successful
CI Trade-In / changes (pull_request) Successful in 7s
CI Trade-In / browser-tests (pull_request) Has been skipped
CI / frontend-tests (pull_request) Has been skipped
CI / openapi-codegen-check (pull_request) Has been skipped
CI / changes (pull_request) Successful in 9s
CI Trade-In / frontend-checks (pull_request) Has been skipped
CI / backend-tests (pull_request) Has been skipped
CI Trade-In / backend-tests (pull_request) Successful in 4m33s
All checks were successful
CI Trade-In / changes (pull_request) Successful in 7s
CI Trade-In / browser-tests (pull_request) Has been skipped
CI / frontend-tests (pull_request) Has been skipped
CI / openapi-codegen-check (pull_request) Has been skipped
CI / changes (pull_request) Successful in 9s
CI Trade-In / frontend-checks (pull_request) Has been skipped
CI / backend-tests (pull_request) Has been skipped
CI Trade-In / backend-tests (pull_request) Successful in 4m33s
Проверка после написания: у is_pro_seller НЕТ единого смысла, из-за
которого её можно было бы выводить из agency_name.
cian — offer["isPro"], флаг ПЛАТНОЙ PRO-подписки
(019_listings_alter_cian.sql:43: «PRO подписка у продавца»)
yandex — author.category in {AGENCY, AGENT}, категория продавца
(yandex/serp.py:203-220)
Это уже два разных смысла в одной колонке. «Есть непустой agency_name»
стал бы третьим — и поехал бы в оценщик trade-in наравне с первыми двумя,
причём у domklik agency_name заполнен у 100% записей, то есть колонка
разом получила бы 1338 значений с новой семантикой.
Правильный ход — сначала решить, что эта колонка вообще означает, и
привести к одному смыслу всех троих. Это отдельная задача, не проброс
поля. Здесь остаётся только isRosreestrApproved, у которого соответствие
однозначное и подтверждается cian (offer["isRosreestrChecked"] ->
is_rosreestr_checked, cian/serp.py:1014) — прямой passthrough.
registry_match не трогается: судя по 011_listings_alter.sql:54
(«Совпадают площадь, адрес и этаж») и по тому, что его пишет только
avito/detail.py, это сверка ЕГРН по трём атрибутам с детальной страницы,
а не SERP-флаг «проверено».
Проверено: 114 passed, 1 skipped (-k domclick).
Refs #3064
This commit is contained in:
parent
db31473611
commit
7f829ccc61
2 changed files with 15 additions and 23 deletions
|
|
@ -90,12 +90,18 @@ def test_map_item_basic_mapping() -> None:
|
|||
assert lot.lon == pytest.approx(60.612)
|
||||
|
||||
|
||||
def test_map_item_promotes_rosreestr_and_pro_seller_from_bff_fixture() -> None:
|
||||
"""isRosreestrApproved / seller.company из BFF-фикстуры пробрасываются в
|
||||
ScrapedLot.is_rosreestr_checked / is_pro_seller (#3064 п.1-2).
|
||||
def test_map_item_promotes_rosreestr_from_bff_fixture() -> None:
|
||||
"""isRosreestrApproved из BFF-фикстуры доезжает до
|
||||
ScrapedLot.is_rosreestr_checked (#3064 п.1).
|
||||
|
||||
На проде 1338 активных domklik-листингов имели ОБЕ колонки 100% NULL, хотя
|
||||
isRosreestrApproved и seller уже парсились и оседали только в raw_payload.
|
||||
На проде у всех 1338 активных domklik-листингов колонка была NULL, хотя поле
|
||||
уже парсилось и оседало в raw_payload. Соответствие 1:1 с cian
|
||||
(`offer.get("isRosreestrChecked")`, cian/serp.py:1014) — без трансформаций.
|
||||
|
||||
is_pro_seller здесь НЕ проверяется намеренно: колонка уже несёт два разных
|
||||
смысла (cian — платная PRO-подписка, `019_listings_alter_cian.sql:43`;
|
||||
yandex — категория продавца AGENCY/AGENT, `yandex/serp.py:203-220`), и
|
||||
выводить её из наличия agency_name значило бы завести третий. См. #3064.
|
||||
"""
|
||||
import json
|
||||
from pathlib import Path
|
||||
|
|
@ -106,22 +112,17 @@ def test_map_item_promotes_rosreestr_and_pro_seller_from_bff_fixture() -> None:
|
|||
config = SimpleNamespace(browser_http_endpoint="http://tradein-browser:9000")
|
||||
scraper = DomClickScraper(config, delay_provider=lambda _name: 8.0)
|
||||
|
||||
# item 1001: isRosreestrApproved=true, seller.company="АН Этажи" (непустая
|
||||
# строка) -> ЕГРН-сверка пройдена и продавец агентство/агент.
|
||||
# item 1001: isRosreestrApproved=true -> ЕГРН-сверка пройдена.
|
||||
lot_checked = scraper._map_item(items[0])
|
||||
assert lot_checked is not None
|
||||
assert lot_checked.is_rosreestr_checked is True
|
||||
assert lot_checked.agency_name == "АН Этажи"
|
||||
assert lot_checked.is_pro_seller is True
|
||||
|
||||
# item 1003: isRosreestrApproved отсутствует в payload, seller=None ->
|
||||
# оба поля неизвестны (None), а НЕ False/True — отсутствие данных не
|
||||
# то же самое, что "проверено — не сходится" / "не агентство".
|
||||
# item 1003: ключа isRosreestrApproved в payload нет вовсе -> None, а НЕ
|
||||
# False. Отсутствие данных не то же самое, что "проверено — не сходится":
|
||||
# False поехал бы в оценщик как утверждение о квартире.
|
||||
lot_unknown = scraper._map_item(items[2])
|
||||
assert lot_unknown is not None
|
||||
assert lot_unknown.is_rosreestr_checked is None
|
||||
assert lot_unknown.agency_name is None
|
||||
assert lot_unknown.is_pro_seller is None
|
||||
|
||||
|
||||
# ── fetch_city: report_ban на QRATOR-блок (#2600 п.1) ───────────────────────────
|
||||
|
|
|
|||
|
|
@ -661,14 +661,6 @@ class DomClickScraper(BaseScraper):
|
|||
if not isinstance(seller, dict):
|
||||
seller = {}
|
||||
agency_name = _extract_agency_name(seller)
|
||||
# is_pro_seller выводим из agency_name (тот же паттерн промоута, что
|
||||
# у cian/yandex #2008): непустое имя агентства/агента -> pro-продавец.
|
||||
# None остаётся None (нет данных о продавце) — не путать с "точно
|
||||
# частник" (False). agency_name="" не бывает (_extract_agency_name
|
||||
# уже схлопывает whitespace-only в None), но проверяем `is not None`
|
||||
# явно, а не `!= ""`, чтобы не превратить None в True по ошибке.
|
||||
is_pro_seller: bool | None = None if agency_name is None else bool(agency_name)
|
||||
|
||||
# ── ЕГРН-проверка (Layer A promote, #3064) ─────────────────────────
|
||||
# isRosreestrApproved — прямое 1:1 соответствие ScrapedLot.is_rosreestr_checked
|
||||
# (mirror cian serp.py: offer.get("isRosreestrChecked")). Оставляем ключ и
|
||||
|
|
@ -727,7 +719,6 @@ class DomClickScraper(BaseScraper):
|
|||
repair_state=repair_state,
|
||||
description_minhash=description_minhash,
|
||||
agency_name=agency_name,
|
||||
is_pro_seller=is_pro_seller,
|
||||
is_rosreestr_checked=is_rosreestr_checked,
|
||||
raw_payload=raw_payload,
|
||||
)
|
||||
|
|
|
|||
Loading…
Add table
Reference in a new issue