uchill/backend/config/celery.py

179 lines
8.1 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 конфигурация для фоновых задач.
"""
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
},
# ============================================
# РЕФЕРАЛЬНАЯ СИСТЕМА
# ============================================
# Обработка отложенных реферальных бонусов каждый день в 6:00
'process-pending-referral-bonuses': {
'task': 'apps.referrals.tasks.process_pending_referral_bonuses',
'schedule': crontab(hour=6, minute=0),
},
}
@app.task(bind=True, ignore_result=True)
def debug_task(self):
"""Тестовая задача для проверки работы Celery."""
print(f'Request: {self.request!r}')