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