""" Celery конфигурация для фоновых задач. """ import os from celery import Celery from celery.schedules import crontab from celery import signals # Установка настроек Django для Celery os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'config.settings') app = Celery('platform') # Загрузка конфигурации из Django settings с префиксом CELERY_ app.config_from_object('django.conf:settings', namespace='CELERY') # Автоматическое обнаружение tasks.py в приложениях app.autodiscover_tasks() @signals.worker_ready.connect def on_worker_ready(sender=None, **kwargs): """ Запуск задач при старте Celery worker. Обрабатывает накопившиеся занятия, которые нужно обновить. """ from apps.schedule.tasks import start_lessons_automatically try: # Запускаем задачу синхронно при старте worker, чтобы сразу обработать накопившиеся занятия start_lessons_automatically() import logging logger = logging.getLogger(__name__) logger.info('[Celery] Задача start_lessons_automatically выполнена при старте worker') except Exception as e: import logging logger = logging.getLogger(__name__) logger.warning(f'[Celery] Ошибка при запуске start_lessons_automatically при старте: {str(e)}') # Периодические задачи (Celery Beat) app.conf.beat_schedule = { # ============================================ # ЗАДАЧИ ПОДПИСОК # ============================================ # Проверка истекших подписок каждый день в 00:00 'check-expired-subscriptions': { 'task': 'apps.subscriptions.tasks.check_expired_subscriptions', 'schedule': crontab(hour=0, minute=0), # Каждый день в 00:00 }, # Отправка предупреждений об истечении подписок каждый день в 10:00 'send-expiration-warnings': { 'task': 'apps.subscriptions.tasks.send_expiration_warnings', 'schedule': crontab(hour=10, minute=0), # Каждый день в 10:00 }, # Автопродление подписок каждый день в 02:00 'auto-renew-subscriptions': { 'task': 'apps.subscriptions.tasks.auto_renew_subscriptions', 'schedule': crontab(hour=2, minute=0), # Каждый день в 02:00 }, # Сброс месячного использования 1-го числа каждого месяца в 00:00 'reset-monthly-usage': { 'task': 'apps.subscriptions.tasks.reset_monthly_usage', 'schedule': crontab(day_of_month=1, hour=0, minute=0), # 1-го числа в 00:00 }, # Очистка старой истории платежей 1-го числа каждого месяца в 03:00 'cleanup-old-payment-history': { 'task': 'apps.subscriptions.tasks.cleanup_old_payment_history', 'schedule': crontab(day_of_month=1, hour=3, minute=0), # 1-го числа в 03:00 }, # Генерация отчетов по подпискам 1-го числа каждого месяца в 09:00 'generate-subscription-reports': { 'task': 'apps.subscriptions.tasks.generate_subscription_reports', 'schedule': crontab(day_of_month=1, hour=9, minute=0), # 1-го числа в 09:00 }, # ============================================ # ЗАДАЧИ РАСПИСАНИЯ # ============================================ # Автоматическое начало и завершение занятий по времени (каждую минуту) 'start-lessons-automatically': { 'task': 'apps.schedule.tasks.start_lessons_automatically', 'schedule': 60.0, # каждые 60 секунд }, # Отправка напоминаний о занятиях за 1 час 'send-lesson-reminders': { 'task': 'apps.schedule.tasks.send_lesson_reminders', 'schedule': crontab(minute='*/15'), # Каждые 15 минут }, # Отправка запросов о подтверждении присутствия за 3 часа до занятия 'send-attendance-confirmation-requests': { 'task': 'apps.schedule.tasks.send_attendance_confirmation_requests', 'schedule': crontab(minute='*/10'), # Каждые 10 минут }, # Отправка отложенных уведомлений каждую минуту 'send-scheduled-notifications': { 'task': 'apps.notifications.tasks.send_scheduled_notifications', 'schedule': 60.0, # Каждые 60 секунд }, # Очистка старых уведомлений каждый день в 3:00 'cleanup-old-notifications': { 'task': 'apps.notifications.tasks.cleanup_old_notifications', 'schedule': crontab(hour=3, minute=0), }, # Очистка старых файлов домашних заданий каждую неделю 'cleanup-old-homework-files': { 'task': 'apps.homework.tasks.cleanup_old_files', 'schedule': crontab(day_of_week=0, hour=2, minute=0), # Воскресенье в 2:00 }, # Автоматическое завершение неактивных видеокомнат (каждые 5 минут) 'end-inactive-video-rooms': { 'task': 'apps.video.tasks.end_inactive_rooms', 'schedule': 300.0, # каждые 5 минут }, # Поддержание 12 будущих занятий для повторяющихся занятий (каждый день в 2:00) 'maintain-recurring-lessons': { 'task': 'apps.schedule.tasks.maintain_recurring_lessons', 'schedule': crontab(hour=2, minute=0), # Каждый день в 2:00 }, # Перенос кастомных предметов в общую модель (каждый день в 3:00) 'promote-mentor-subjects-to-subjects': { 'task': 'apps.schedule.tasks.promote_mentor_subjects_to_subjects', 'schedule': crontab(hour=3, minute=0), # Каждый день в 3:00 }, # Автоматическое создание бэкапа базы данных каждый день в 2:00 'backup-database': { 'task': 'apps.core.tasks.backup_database', 'schedule': crontab(hour=2, minute=0), # Каждый день в 2:00 }, # Очистка старых бэкапов каждый день в 4:00 'cleanup-old-backups': { 'task': 'apps.core.tasks.cleanup_old_backups', 'schedule': crontab(hour=4, minute=0), # Каждый день в 4:00 }, # Синхронизация квот хранилища с подписками каждый день в 1:00 'sync-all-storage-quotas': { 'task': 'apps.materials.tasks.sync_all_storage_quotas', 'schedule': crontab(hour=1, minute=0), # Каждый день в 1:00 }, # Очистка старых неиспользуемых материалов каждую неделю в воскресенье в 3:00 'cleanup-old-unused-materials': { 'task': 'apps.materials.tasks.cleanup_old_unused_materials', 'schedule': crontab(day_of_week=0, hour=3, minute=0), # Воскресенье в 3:00 }, } @app.task(bind=True, ignore_result=True) def debug_task(self): """Тестовая задача для проверки работы Celery.""" print(f'Request: {self.request!r}')