74 lines
2.5 KiB
Python
74 lines
2.5 KiB
Python
"""
|
|
Celery tasks for Lyngsat data processing.
|
|
"""
|
|
import logging
|
|
from celery import shared_task
|
|
from django.core.cache import cache
|
|
|
|
from .utils import fill_lyngsat_data
|
|
|
|
logger = logging.getLogger(__name__)
|
|
|
|
|
|
@shared_task(bind=True, name='lyngsatapp.fill_lyngsat_data_async')
|
|
def fill_lyngsat_data_task(self, target_sats, regions=None):
|
|
"""
|
|
Асинхронная задача для заполнения данных Lyngsat.
|
|
|
|
Args:
|
|
target_sats: Список названий спутников для обработки
|
|
regions: Список регионов для парсинга (по умолчанию все)
|
|
|
|
Returns:
|
|
dict: Статистика обработки
|
|
"""
|
|
task_id = self.request.id
|
|
logger.info(f"[Task {task_id}] Начало обработки данных Lyngsat")
|
|
logger.info(f"[Task {task_id}] Спутники: {', '.join(target_sats)}")
|
|
logger.info(f"[Task {task_id}] Регионы: {', '.join(regions) if regions else 'все'}")
|
|
|
|
# Обновляем статус задачи
|
|
self.update_state(
|
|
state='PROGRESS',
|
|
meta={
|
|
'current': 0,
|
|
'total': len(target_sats),
|
|
'status': 'Инициализация...'
|
|
}
|
|
)
|
|
|
|
try:
|
|
# Вызываем функцию заполнения данных
|
|
stats = fill_lyngsat_data(
|
|
target_sats=target_sats,
|
|
regions=regions,
|
|
task_id=task_id,
|
|
update_progress=lambda current, total, status: self.update_state(
|
|
state='PROGRESS',
|
|
meta={
|
|
'current': current,
|
|
'total': total,
|
|
'status': status
|
|
}
|
|
)
|
|
)
|
|
|
|
logger.info(f"[Task {task_id}] Обработка завершена успешно")
|
|
logger.info(f"[Task {task_id}] Статистика: {stats}")
|
|
|
|
# Сохраняем результат в кеш для отображения на странице
|
|
cache.set(f'lyngsat_task_{task_id}', stats, timeout=3600)
|
|
|
|
return stats
|
|
|
|
except Exception as e:
|
|
logger.error(f"[Task {task_id}] Ошибка при обработке: {str(e)}", exc_info=True)
|
|
self.update_state(
|
|
state='FAILURE',
|
|
meta={
|
|
'error': str(e),
|
|
'status': 'Ошибка при обработке'
|
|
}
|
|
)
|
|
raise
|