gendesign/tradein-mvp/backend/app/services
bot-backend ec7838b7a9
All checks were successful
CI Trade-In / changes (pull_request) Successful in 7s
CI Trade-In / frontend-checks (pull_request) Has been skipped
CI / backend-tests (pull_request) Has been skipped
CI / frontend-tests (pull_request) Has been skipped
CI / openapi-codegen-check (pull_request) Has been skipped
CI Trade-In / browser-tests (pull_request) Has been skipped
CI / changes (pull_request) Successful in 9s
CI Trade-In / backend-tests (pull_request) Successful in 4m58s
fix(#3398): пустой пул в фоновой догрузке — WARNING без трейсбека (общая функция); комментарий про stateless
На проде `ESTIMATE_EXTERNAL_SOURCES_BACKGROUND=true` (docker-compose.prod.yml:296),
поэтому синхронный cian-вызов идёт с `fetch_on_miss=False` и возвращает None ДО
прокси-слоя (`providers/cian/valuation.py:171`) — добавленная в этой ветке ветка
WARNING в `estimate_quality` на проде почти не звучит. Настоящий фетч уходит в
`_defer_external_refresh`, где `NoProxyAvailableError` попадал в общий
`except Exception: logger.exception(...)` → ERROR + traceback → событие в GlitchTip
на каждый /estimate по новому адресу: ровно тот шум, который PR и убирает.

Правка в ОБЩЕЙ функции отложенной догрузки, а не в cian-ветке: через неё идут все
источники фонового режима (yandex тоже — у него swallow живёт внутри
`_get_or_fetch_yandex_valuation_cached`, дыры нет, но следующий источник получит
поведение бесплатно). Для прочих исключений всё как было: `logger.exception`.

Тест по значению: background=True + пустой пул в production → фоновая догрузка cian
логирует WARNING «пул прокси пуст», записей ERROR/traceback у логгера эстиматора нет.
Задача дожидается внутри того же loop'а и не снимая патчей (`_DEFERRED_REFRESH_TASKS`
+ `asyncio.gather`) — иначе `anyio.run` закрывает loop раньше старта задачи и тест
был бы зелёным по построению. На HEAD ветки тест красный:
  ERROR app.services.estimator:estimator.py:910 deferred cian_valuation: догрузка не
  удалась (кэш не прогрет) + Traceback … NoProxyAvailableError.

Комментарий у `_c_kwargs`: весь dict переиспользуется замыканием фоновой задачи, то
есть `config`/`proxy_provider` — один инстанс на два возможно-одновременных вызова.
Корректно ровно пока оба stateless (`RealScraperConfig` — read-only снимок настроек,
`RealProxyProvider` без полей, короткая сессия БД на операцию); появится per-вызов
состояние — фоновой задаче нужен свой инстанс.
2026-09-06 11:58:42 +05:00
..
exporters fix(tradein/pdf): клиентский PDF не называет площадки-источники — «Источник N», как в веб-отчёте (#3341) 2026-09-03 11:58:45 +03:00
matching feat(tradein/matching): region_code у houses — вывод, а не выдумка (#3051 п.4) 2026-08-27 13:51:48 +05:00
payments fix(payments): обрыв соединения и Init без PaymentURL перестают запирать покупателя 2026-09-06 00:11:35 +05:00
tgbot fix(tradein/support): один повтор терял каждое одиннадцатое сообщение в поддержку 2026-09-01 09:53:21 +03:00
__init__.py feat: add tradein-mvp subproject (Trade-In Estimator под /trade-in) 2026-05-21 00:25:39 +03:00
account_quota.py fix(tradein): резолвить роль из реестра, roles.yaml — только fallback (#3316) 2026-09-02 14:49:27 +05:00
auth_session.py feat(tradein): переключаемый реестр людей — подготовка переезда «Меры» в БД auth [PR-2b/6] 2026-08-01 02:50:14 +03:00
backfill_block_breaker.py fix(tradein): вид блока решает обрыв по доле и статус прогона (#3288 часть B) 2026-09-06 00:09:37 +05:00
brand.py fix(tradein/pdf): МЕРА branding + 4-page report, no empty pages (#2513) 2026-07-13 18:04:07 +00:00
buildings_query.py fix(tradein/sale-share): гард по этажности — отсечь near-neighbor mis-match 2026-06-29 00:31:09 +03:00
cache.py chore(format): нормализация под ruff 0.15.20 — 161 файл, только формат (#2864) (#3022) 2026-08-21 12:01:52 +00:00
cian_price_history.py fix(tradein/scrapers): убрать оставшиеся обходы пула прокси (#2830) (#2833) 2026-08-12 10:53:36 +00:00
cian_session.py fix(tradein/scrapers): три прод-пути остались на chrome120, пока kit ушёл на chrome146 2026-08-27 18:18:05 +03:00
dadata.py fix(tradein/geocoder): local houses fallback + downgrade DaData CLEAN-disabled noise 2026-08-15 18:08:09 +03:00
data_erasure.py fix(tradein/privacy): нормализация телефона к каноническому РФ-виду при erasure (#2547) 2026-08-06 19:59:34 +03:00
domclick_session.py fix(tradein): сигналы о сбоях наконец становятся событиями, а протухание кук предупреждает заранее (#2674) 2026-08-06 02:29:11 +05:00
domrf_kapremont_loader.py fix(tradein/ingest): 4 data-integrity дефекта в бэкфилле годов и импорте ДКП 2026-07-12 22:12:31 +03:00
estimator.py fix(#3398): пустой пул в фоновой догрузке — WARNING без трейсбека (общая функция); комментарий про stateless 2026-09-06 11:58:42 +05:00
gar_flats_loader.py chore(tradein): четыре символа, на которые нет ни одной ссылки 2026-08-29 15:59:54 +03:00
geocoder.py fix(tradein): подсказки адреса — пустые части адреса выпадают, а не печатаются 2026-08-30 14:58:03 +05:00
house_dedup_merge.py fix(tradein/dedup): остаток схлопывания домов становится измеряемым числом, а не оценкой (#2690) (#2820) 2026-08-10 11:18:19 +00:00
house_imv_backfill.py fix(tradein/imv): «временная» ошибка снова временная — 1390 домов возвращаются в очередь (#2843) 2026-08-12 16:06:24 +00:00
house_metadata.py chore(format): нормализация под ruff 0.15.20 — 161 файл, только формат (#2864) (#3022) 2026-08-21 12:01:52 +00:00
identity_store.py feat(tradein): переключаемый реестр людей — подготовка переезда «Меры» в БД auth [PR-2b/6] 2026-08-01 02:50:14 +03:00
image_sanitizer.py fix(tradein/photos): защита от pixel-flood DoS в image_sanitizer 2026-07-12 22:12:12 +03:00
location_index.py feat(tradein/geo): реестр регионов — единственный источник гео-границ (#3051, шард 1a) 2026-08-26 18:39:28 +05:00
product_handlers.py fix(#3197): no_proxy_stop=1 как у соседей, INFO на финале хендлера, докстринг фабрики 2026-09-06 06:27:40 +05:00
proxy_egress.py fix(tradein/proxy): учитывать историю банов при выборе egress-узла (#2877) 2026-08-13 17:47:01 +00:00
proxy_pool.py fix(tradein/proxy): успешный fetch затирал exit_ip и latency_ms в NULL (#3283) (#3305) 2026-08-31 14:53:33 +00:00
proxy_rotation.py feat(tradein/proxy_rotation): ротация IP через mobileproxy.space (aproxy.site) (#3298) 2026-08-31 11:01:41 +00:00
regions.py feat(tradein/geo): реестр регионов — единственный источник гео-границ (#3051, шард 1a) 2026-08-26 18:39:28 +05:00
rosreestr_poll.py fix(tradein): чинит такт загрузки СберИндекса — иначе новый ERROR стал бы ложной тревогой (#2674) 2026-08-06 02:53:26 +05:00
sber_index.py fix(tradein/sber): сторож мерит отставание загрузки, а не календарь (#2846) (#2849) 2026-08-12 19:36:20 +00:00
scheduler.py fix(#3384): cian — в mark_failed уходит только измеренное, нули heartbeat не затираются; стаб пула как прод 2026-09-06 06:27:45 +05:00
scrape_runs.py fix(#3393): capped по сканированному окну — interrupted-строка не глушит лестницу навсегда; контроль zero-сторожа 2026-09-06 10:07:29 +05:00
scraper_adapters.py chore(tradein): две ручки ротации, которых не осталось читателей, и врущий комментарий над ними 2026-08-29 17:07:04 +03:00
scraper_settings.py chore(tradein): деактивировать N1.ru scraper — источник переехал в Cian 2026-06-16 14:50:51 +03:00
search_query.py fix(tradein/matching): честность тиров сопоставления домов (#2674) 2026-08-06 04:37:12 +05:00
street_scheme.py feat(mera/b2c): улица сделки доезжает до витрины готовой схемой, а не геометрией 2026-08-29 23:25:44 +05:00
user_events.py feat(tradein/audit): request-audit middleware + estimate_request logging → user_events (#2519) 2026-07-13 20:09:22 +00:00
yandex_address_backfill.py style(tradein): уложить перенесённые строки в лимит 100 символов 2026-08-27 18:24:09 +03:00
yandex_price_history.py docs(#3376): ссылка на follow-up #3385 вместо TODO в yandex_price_history 2026-09-05 22:57:04 +00:00
yandex_session.py docs(tradein/scrapers): в репозитории лежало опровергнутое обоснование хранилища сессий Яндекса 2026-08-28 22:52:47 +03:00
zhkh_flats_loader.py fix(tradein): cadastre ЖКХ-fallback + COALESCE merge-key + median-floors guard 2026-06-29 01:32:48 +03:00