Добавил форму для загрузки данных с LyngSat
This commit is contained in:
@@ -37,6 +37,7 @@ from .forms import (
|
||||
UploadFileForm,
|
||||
UploadVchLoad,
|
||||
VchLinkForm,
|
||||
FillLyngsatDataForm,
|
||||
)
|
||||
from .mixins import CoordinateProcessingMixin, FormMessageMixin, RoleRequiredMixin
|
||||
from .models import Geo, Modulation, ObjItem, Polarization, Satellite
|
||||
@@ -1029,3 +1030,97 @@ class ObjItemDetailView(LoginRequiredMixin, View):
|
||||
}
|
||||
|
||||
return render(request, "mainapp/objitem_detail.html", context)
|
||||
|
||||
|
||||
class FillLyngsatDataView(LoginRequiredMixin, FormMessageMixin, FormView):
|
||||
"""
|
||||
Представление для заполнения данных из Lyngsat.
|
||||
|
||||
Позволяет выбрать спутники и регионы для парсинга данных с сайта Lyngsat.
|
||||
Запускает асинхронную задачу Celery для обработки.
|
||||
"""
|
||||
template_name = "mainapp/fill_lyngsat_data.html"
|
||||
form_class = FillLyngsatDataForm
|
||||
success_url = reverse_lazy("mainapp:lyngsat_task_status")
|
||||
error_message = "Форма заполнена некорректно"
|
||||
|
||||
def form_valid(self, form):
|
||||
satellites = form.cleaned_data["satellites"]
|
||||
regions = form.cleaned_data["regions"]
|
||||
|
||||
# Получаем названия спутников
|
||||
target_sats = [sat.name for sat in satellites]
|
||||
|
||||
try:
|
||||
from lyngsatapp.tasks import fill_lyngsat_data_task
|
||||
|
||||
# Запускаем асинхронную задачу
|
||||
task = fill_lyngsat_data_task.delay(target_sats, regions)
|
||||
|
||||
messages.success(
|
||||
self.request,
|
||||
f"Задача запущена! ID задачи: {task.id}. "
|
||||
"Вы будете перенаправлены на страницу отслеживания прогресса."
|
||||
)
|
||||
|
||||
# Перенаправляем на страницу статуса задачи
|
||||
return redirect('mainapp:lyngsat_task_status', task_id=task.id)
|
||||
|
||||
except Exception as e:
|
||||
messages.error(self.request, f"Ошибка при запуске задачи: {str(e)}")
|
||||
return redirect("mainapp:fill_lyngsat_data")
|
||||
|
||||
|
||||
class LyngsatTaskStatusView(LoginRequiredMixin, View):
|
||||
"""
|
||||
Представление для отслеживания статуса задачи заполнения данных Lyngsat.
|
||||
"""
|
||||
template_name = "mainapp/lyngsat_task_status.html"
|
||||
|
||||
def get(self, request, task_id=None):
|
||||
context = {
|
||||
'task_id': task_id
|
||||
}
|
||||
return render(request, self.template_name, context)
|
||||
|
||||
|
||||
class LyngsatTaskStatusAPIView(LoginRequiredMixin, View):
|
||||
"""
|
||||
API для получения статуса задачи Celery.
|
||||
"""
|
||||
def get(self, request, task_id):
|
||||
from celery.result import AsyncResult
|
||||
from django.core.cache import cache
|
||||
|
||||
task = AsyncResult(task_id)
|
||||
|
||||
response_data = {
|
||||
'task_id': task_id,
|
||||
'state': task.state,
|
||||
'result': None,
|
||||
'error': None
|
||||
}
|
||||
|
||||
if task.state == 'PENDING':
|
||||
response_data['status'] = 'Задача в очереди...'
|
||||
elif task.state == 'PROGRESS':
|
||||
response_data['status'] = task.info.get('status', '')
|
||||
response_data['current'] = task.info.get('current', 0)
|
||||
response_data['total'] = task.info.get('total', 1)
|
||||
response_data['percent'] = int((task.info.get('current', 0) / task.info.get('total', 1)) * 100)
|
||||
elif task.state == 'SUCCESS':
|
||||
# Получаем результат из кеша
|
||||
result = cache.get(f'lyngsat_task_{task_id}')
|
||||
if result:
|
||||
response_data['result'] = result
|
||||
response_data['status'] = 'Задача завершена успешно'
|
||||
else:
|
||||
response_data['result'] = task.result
|
||||
response_data['status'] = 'Задача завершена'
|
||||
elif task.state == 'FAILURE':
|
||||
response_data['status'] = 'Ошибка при выполнении задачи'
|
||||
response_data['error'] = str(task.info)
|
||||
else:
|
||||
response_data['status'] = task.state
|
||||
|
||||
return JsonResponse(response_data)
|
||||
|
||||
Reference in New Issue
Block a user