""" 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