gendesign/backend/app/workers/tasks/pzz_sync.py
Light1YT 1883271908
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
fix(cadastre): NSPD 500-retry + per-layer skip (#252) + disable dead pzz-beat (#259) + geom backfill (#200)
#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
2026-06-13 20:45:05 +05:00

61 lines
2.8 KiB
Python
Raw Permalink Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

"""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