""" Celery configuration for ThrillWiki. This module sets up Celery for background task processing including: - Trending calculations - Cache warming - Analytics processing - Email notifications """ import os from celery import Celery # Set the default Django settings module for the 'celery' program. os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'config.django.local') app = Celery('thrillwiki') # Get Redis URL from environment variable with fallback REDIS_URL = os.environ.get('REDIS_URL', 'redis://localhost:6379/1') # Celery Configuration - set directly without loading from Django settings first app.conf.update( # Broker settings broker_url=REDIS_URL, result_backend=REDIS_URL, # Task settings task_serializer='json', accept_content=['json'], result_serializer='json', timezone='America/New_York', enable_utc=True, # Worker settings worker_prefetch_multiplier=1, task_acks_late=True, worker_max_tasks_per_child=1000, # Task routing task_routes={ 'apps.core.tasks.trending.*': {'queue': 'trending'}, 'apps.core.tasks.analytics.*': {'queue': 'analytics'}, 'apps.core.tasks.cache.*': {'queue': 'cache'}, }, # Beat schedule for periodic tasks beat_schedule={ 'calculate-trending-content': { 'task': 'apps.core.tasks.trending.calculate_trending_content', 'schedule': 300.0, # Every 5 minutes }, 'warm-trending-cache': { 'task': 'apps.core.tasks.trending.warm_trending_cache', 'schedule': 900.0, # Every 15 minutes }, 'cleanup-old-analytics': { 'task': 'apps.core.tasks.analytics.cleanup_old_analytics', 'schedule': 86400.0, # Daily }, }, # Task result settings result_expires=3600, # 1 hour task_ignore_result=False, # Error handling task_reject_on_worker_lost=True, task_soft_time_limit=300, # 5 minutes task_time_limit=600, # 10 minutes ) # Load task modules from all registered Django apps. app.autodiscover_tasks() @app.task(bind=True) def debug_task(self): """Debug task for testing Celery setup.""" print(f'Request: {self.request!r}')