"""Celery application configuration and scheduling.""" import os from celery import Celery from celery.schedules import crontab from decouple import config os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'config.settings.development') app = Celery('config') app.config_from_object('django.conf:settings', namespace='CELERY') app.autodiscover_tasks() app.conf.update( broker_url=config('REDIS_URL', default='redis://localhost:6379/0'), result_backend=config('REDIS_URL', default='redis://localhost:6379/0'), task_serializer='json', accept_content=['json'], result_serializer='json', timezone='UTC', enable_utc=True, task_track_started=True, task_time_limit=30 * 60, task_soft_time_limit=60, worker_prefetch_multiplier=1, worker_max_tasks_per_child=1000, ) app.conf.beat_schedule = { 'send-event-reminders': { 'task': 'apps.communications.tasks.send_event_reminders', 'schedule': crontab(minute=0, hour='*/1'), 'description': 'Runs hourly to notify about upcoming events.', }, 'cleanup-notification-retention': { 'task': 'apps.notifications.tasks.cleanup_notification_retention', 'schedule': crontab(hour=2, minute=0), 'description': 'Runs daily at 02:00 UTC to cleanup notification retention.', }, 'sweep-stale-payment-verifications': { 'task': 'apps.payments.sweep_stale_payment_verifications', 'schedule': crontab(minute='*/5'), 'description': 'Recovers old unresolved payment attempts with bounded gateway verification.', }, 'expire-stale-registration-checkouts': { 'task': 'apps.events.expire_stale_registration_checkouts', 'schedule': crontab(minute='*'), 'description': 'Releases seats from paid checkouts after their 15-minute window.', }, 'deliver-registration-notifications': { 'task': 'apps.events.deliver_pending_registration_notifications', 'schedule': crontab(minute='*'), 'description': 'Retries committed registration notifications.', }, 'sweep-pending-refunds': { 'task': 'apps.payments.sweep_pending_refunds', 'schedule': crontab(minute='*/5'), 'description': 'Recovers pending transaction reversals and exposes exhausted attempts for admin review.', }, } CELERY_TASK_SOFT_TIME_LIMIT = 20 CELERY_TASK_TIME_LIMIT = 30