gendesign/backend/app/workers/tasks/pzz_sync.py

51 lines
1.7 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.
Запускается вручную через 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:
logger.exception("pzz_sync failed: %s", e)
_log_breadcrumb("error", f"{type(e).__name__}: {e}")
raise