Commit graph

5 commits

Author SHA1 Message Date
lekss361
ef3e0404a6 feat(22d): domrf_catalog_object scraper — fill ~25 NULL kn_objects cols from SSR __NEXT_DATA__
kn-API не возвращает wall_type, energy_eff, ceiling_height_m, parking_*,
playground_*, finishing_variants_count, has_*, scores и др. Эти поля доступны
только на SSR catalog странице /сервисы/каталог-новостроек/объект/{id} в
__NEXT_DATA__ JSON блоке (Next.js).

- backend/app/services/scrapers/domrf_catalog_object.py — fetch HTML через
  BrowserSession (WAF bypass), extract __NEXT_DATA__, parse 25+ fields, COALESCE
  UPDATE (не перетирает kn-API данные)
- backend/app/workers/tasks/scrape_kn_catalog_objects.py — Celery task, atomic
  SELECT (obj_id + snapshot_date одним запросом, без race с kn-scraper)
- backend/app/workers/beat_schedule.py — Tuesday 04:00 UTC, batch 300/run
- data/sql/118_22d_catalog_object_scraped_at.sql — catalog_scraped_at TIMESTAMP
  + index NULLS FIRST для "missing/stale first" selection
- backend/tests/services/scrapers/test_domrf_catalog_object.py — 41 tests pass

obj_checks 6 чекбоксов "Проверено на наш.дом.рф" — отдельная investigation
(на странице только общий isChecked flag).
2026-05-18 00:15:57 +03:00
lekss361
d4da1b26c6 fix(#231): re-enable nspd-harvest-stale-quarters beat schedule (Sub-PR D)
После Sub-PR B (#260, merged 8ebcd15) переключения search_by_quarter на
grid-walk dispatch — beat schedule безопасно re-enable'ить:

- harvest_quarter возвращает полноценные dumps (territorial_zones + ЗОУИТ +
  risk zones + engineering structures) вместо 0-3 features
- per-instance semaphore (PR #260) защищает от cross-loop binding bug
- soft/hard time_limit 600/900s — задача успевает завершиться

Schedule: Mon 01:00 UTC (04:00 МСК), batch_size=50 ограничивает WAF burst,
max_age_days=90 для регулярного refresh + новые quarters (fetched_at IS NULL).

Полный ЕКБ back-fill (11k+ quarters в cad_quarters_geom) займёт несколько
недель при batch_size=50/week; в production будет ускорено manual trigger
admin endpoint'ом если нужно.

Closes #231.
2026-05-17 10:37:07 +03:00
lekss361
232dbc9285 fix(#233): add pzz_sync to beat schedule (monthly)
PKK6 ArcGIS sync для pzz_zones_ekb (0 rows live) — задача и admin endpoint
уже существуют, но beat schedule отсутствовал. Schedule: 1st of month, 03:00 МСК.

Closes #233
2026-05-17 08:29:40 +03:00
46203ab365 feat(permits): Celery beat monthly + analyze recent_permits (#105 Phase 4+5) (#213)
Some checks failed
Deploy / changes (push) Successful in 5s
Deploy / build-backend (push) Failing after 16s
Deploy / build-frontend (push) Has been skipped
Deploy / build-worker (push) Successful in 3m44s
Deploy / deploy (push) Has been skipped
2026-05-16 12:23:52 +00:00
lekss361
6a256bfc1f
refactor(workers): split celery_app.py god-object into 3 modules (#135)
Per audit batch #127 P3 god objects (issue #134).

Split layout:
- celery_app.py: 270 → 35 lines (config only)
- beat_schedule.py: 207 lines NEW (DB-driven + fallback + hardcoded)
- lifecycle.py: 168 lines NEW (worker_process_init + worker_ready handlers)

No business logic changes — move-only structural refactor. Public API
(celery_app.conf.beat_schedule) unchanged.

Verify:
- beat keys: kn-region-66, objective_sync, refresh-ekb-districts-medians,
  nspd-geo-zombie-cleanup, poi-sync-weekly, noise-sync-weekly
- ruff + ruff-format clean
- AST parse OK

Vault: Module_Beat_Schedule + Module_Worker_Lifecycle NEW;
Module_Celery_App updated.

Closes #134
Refs: #127

Co-authored-by: lekss361 <claudestars@proton.me>
2026-05-15 00:09:38 +03:00