"""Celery app — single source of truth для Celery configuration. Beat schedule build → app/workers/beat_schedule.py. Worker lifecycle hooks (process_init, worker_ready) → app/workers/lifecycle.py. """ import logging from celery import Celery from app.core.config import settings logger = logging.getLogger(__name__) celery_app = Celery( "gendesign", broker=settings.redis_url, backend=settings.redis_url, include=[ "app.workers.tasks.scrape_kn", "app.workers.tasks.refresh_analytics", "app.workers.tasks.scrape_objective", "app.workers.tasks.objective_etl", "app.workers.tasks.nspd_geo", "app.workers.tasks.nspd_sync", "app.workers.tasks.poi_sync", "app.workers.tasks.noise_sync", "app.workers.tasks.pzz_sync", "app.workers.tasks.scrape_cadastre", ], ) celery_app.conf.timezone = "Europe/Moscow" # Apply beat schedule (DB → fallback → hardcoded entries) from app.workers.beat_schedule import build_beat_schedule # noqa: E402 celery_app.conf.beat_schedule = build_beat_schedule() # Register lifecycle hooks (import for side-effect — signal decorator registration) from app.workers import lifecycle # noqa: E402, F401