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

55 lines
1.9 KiB
Python
Raw 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: еженедельная синхронизация OSM POI для site-finder."""
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).
Используется чтобы диагностировать что происходит с poi_sync без SSH к
worker'у (та же техника что у worker_ready breadcrumb).
"""
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, 'poi_sync', :msg)"
),
{"lvl": level, "msg": message[:500]},
)
db.commit()
finally:
db.close()
except Exception as e:
logger.warning("poi_sync breadcrumb failed: %s", e)
@celery_app.task(name="tasks.poi_sync.sync_osm_poi_ekb", queue="celery")
def sync_osm_poi_ekb() -> dict:
"""Еженедельная синхронизация OSM POI из Overpass API в osm_poi_ekb.
Запускается через beat (понедельник 03:00 МСК).
Persistent breadcrumbs в nspd_geo_log чтобы видеть progress в БД.
"""
_log_breadcrumb("info", "task started")
try:
from app.services.site_finder.poi_loader import sync_poi_to_db
result = sync_poi_to_db()
logger.info("POI sync done: %s", result)
_log_breadcrumb("info", f"done: {result}")
return result
except Exception as e:
logger.exception("POI sync failed: %s", e)
_log_breadcrumb("error", f"{type(e).__name__}: {e}")
raise