169 lines
7.7 KiB
Python
169 lines
7.7 KiB
Python
"""
|
||
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}')
|
||
|