Some checks failed
CI / changes (push) Successful in 7s
CI / frontend-tests (push) Has been skipped
CI / changes (pull_request) Successful in 6s
CI / frontend-tests (pull_request) Has been skipped
CI / backend-tests (push) Successful in 6m43s
CI / backend-tests (pull_request) Successful in 6m41s
Deploy / build-backend (push) Blocked by required conditions
Deploy / deploy (push) Blocked by required conditions
Deploy / build-worker (push) Blocked by required conditions
Deploy / build-frontend (push) Blocked by required conditions
Deploy / changes (push) Has been cancelled
#252: NspdBulkServerError на HTTP 5xx + WMS <ServiceException>-body → quarter-level autoretry; _grid_walk_category флагует layer_failed только если ВСЕ cells 5xx (none ok), network-errors исключены — пустой/флапающий слой не ложно-скипается. harvest_meta.layer_X_failed. #259: pzz-sync-monthly beat отключён (PKK6 deprecated, pzz_zones_ekb=0, заменён zone_regulation_cache+NSPD dumps). logger.exception→warning (стоп GlitchTip BACKEND-1B), raise сохранён для admin-endpoint. #200: geom_unavailable флаг (миграция 151) + backfill_parcel_geom task — grid-walk layer 36368 per quarter лечит 930/964 NULL-geom участков (NSPD search вернул центроиды), остаток marks unavailable (не ретраить вечно). SAVEPOINT per-cell, idempotent. Closes #252 Closes #259 Closes #200
61 lines
2.8 KiB
Python
61 lines
2.8 KiB
Python
"""Celery task: импорт ПЗЗ территориальных зон ЕКБ из Росреестр PKK6."""
|
||
|
||
import logging
|
||
|
||
from sqlalchemy import text
|
||
|
||
from app.workers.celery_app import celery_app
|
||
|
||
logger = logging.getLogger(__name__)
|
||
|
||
|
||
def _log_breadcrumb(level: str, message: str) -> None:
|
||
"""Записать строку в nspd_geo_log (job_id=NULL, stage='pzz_sync')."""
|
||
try:
|
||
from app.core.db import SessionLocal
|
||
|
||
db = SessionLocal()
|
||
try:
|
||
db.execute(
|
||
text(
|
||
"INSERT INTO nspd_geo_log (job_id, level, stage, message) "
|
||
"VALUES (NULL, :lvl, 'pzz_sync', :msg)"
|
||
),
|
||
{"lvl": level, "msg": message[:500]},
|
||
)
|
||
db.commit()
|
||
finally:
|
||
db.close()
|
||
except Exception as e:
|
||
logger.warning("pzz_sync breadcrumb failed: %s", e)
|
||
|
||
|
||
@celery_app.task(name="tasks.pzz_sync.sync_pzz_zones_ekb", queue="celery")
|
||
def sync_pzz_zones_ekb() -> dict:
|
||
"""Импорт ПЗЗ территориальных зон ЕКБ из Росреестр PKK6.
|
||
|
||
DEPRECATED (issue #259): источник PKK6 выведен Росреестром, beat-расписание
|
||
pzz-sync-monthly отключено (beat_schedule.py), таблица pzz_zones_ekb пуста.
|
||
ПЗЗ-данные теперь поступают через zone_regulation_cache + NSPD territorial_zones
|
||
dumps. Задача оставлена только для ручного запуска через admin (на случай
|
||
появления рабочего источника).
|
||
|
||
Запускается вручную через POST /api/v1/admin/scrape/pzz-sync.
|
||
Persistent breadcrumbs в nspd_geo_log (stage='pzz_sync') для диагностики.
|
||
"""
|
||
_log_breadcrumb("info", "task started")
|
||
try:
|
||
from app.services.site_finder.pzz_loader import sync_pzz_zones_to_db
|
||
|
||
result = sync_pzz_zones_to_db()
|
||
logger.info("pzz_sync done: %s", result)
|
||
_log_breadcrumb("info", f"done: {result}")
|
||
return result
|
||
except Exception as e:
|
||
# Issue #259: PKK6 deprecated → этот путь почти всегда падает. logger.warning
|
||
# (не .exception) — Sentry/GlitchTip НЕ захватывает warning как error-event,
|
||
# поэтому ручной запуск по дохлому источнику не рекуррентит BACKEND-1B.
|
||
# re-raise сохранён: admin-эндпоинт обязан увидеть фактический провал импорта.
|
||
logger.warning("pzz_sync failed (PKK6 deprecated, см. #259): %s: %s", type(e).__name__, e)
|
||
_log_breadcrumb("warning", f"{type(e).__name__}: {e}")
|
||
raise
|