Реструктуризация views
This commit is contained in:
205
dbapp/mainapp/views/data_import.py
Normal file
205
dbapp/mainapp/views/data_import.py
Normal file
@@ -0,0 +1,205 @@
|
||||
"""
|
||||
Data import views (Excel, CSV, Transponders, VCH, etc.).
|
||||
"""
|
||||
from io import BytesIO
|
||||
|
||||
from django.contrib import messages
|
||||
from django.contrib.auth.mixins import LoginRequiredMixin
|
||||
from django.http import HttpResponse
|
||||
from django.shortcuts import redirect
|
||||
from django.urls import reverse_lazy
|
||||
from django.views import View
|
||||
from django.views.generic import FormView
|
||||
|
||||
import pandas as pd
|
||||
|
||||
from ..forms import (
|
||||
LoadCsvData,
|
||||
LoadExcelData,
|
||||
NewEventForm,
|
||||
UploadFileForm,
|
||||
UploadVchLoad,
|
||||
VchLinkForm,
|
||||
)
|
||||
from ..mixins import FormMessageMixin
|
||||
from ..utils import (
|
||||
add_satellite_list,
|
||||
compare_and_link_vch_load,
|
||||
fill_data_from_df,
|
||||
get_points_from_csv,
|
||||
get_vch_load_from_html,
|
||||
kub_report,
|
||||
)
|
||||
from mapsapp.utils import parse_transponders_from_xml
|
||||
|
||||
|
||||
class AddSatellitesView(LoginRequiredMixin, View):
|
||||
"""View for adding satellites to the database."""
|
||||
|
||||
def get(self, request):
|
||||
add_satellite_list()
|
||||
return redirect("mainapp:home")
|
||||
|
||||
|
||||
class AddTranspondersView(LoginRequiredMixin, FormMessageMixin, FormView):
|
||||
"""View for uploading and parsing transponder data from XML."""
|
||||
|
||||
template_name = "mainapp/transponders_upload.html"
|
||||
form_class = UploadFileForm
|
||||
success_message = "Файл успешно обработан"
|
||||
error_message = "Форма заполнена некорректно"
|
||||
|
||||
def form_valid(self, form):
|
||||
uploaded_file = self.request.FILES["file"]
|
||||
try:
|
||||
content = uploaded_file.read()
|
||||
parse_transponders_from_xml(BytesIO(content))
|
||||
except ValueError as e:
|
||||
messages.error(self.request, f"Ошибка при чтении таблиц: {e}")
|
||||
return redirect("mainapp:add_trans")
|
||||
except Exception as e:
|
||||
messages.error(self.request, f"Неизвестная ошибка: {e}")
|
||||
return redirect("mainapp:add_trans")
|
||||
return super().form_valid(form)
|
||||
|
||||
def get_success_url(self):
|
||||
return reverse_lazy("mainapp:add_trans")
|
||||
|
||||
|
||||
class LoadExcelDataView(LoginRequiredMixin, FormMessageMixin, FormView):
|
||||
"""View for loading data from Excel files."""
|
||||
|
||||
template_name = "mainapp/add_data_from_excel.html"
|
||||
form_class = LoadExcelData
|
||||
error_message = "Форма заполнена некорректно"
|
||||
|
||||
def form_valid(self, form):
|
||||
uploaded_file = self.request.FILES["file"]
|
||||
selected_sat = form.cleaned_data["sat_choice"]
|
||||
number = form.cleaned_data["number_input"]
|
||||
|
||||
try:
|
||||
import io
|
||||
|
||||
df = pd.read_excel(io.BytesIO(uploaded_file.read()))
|
||||
if number > 0:
|
||||
df = df.head(number)
|
||||
result = fill_data_from_df(df, selected_sat, self.request.user.customuser)
|
||||
|
||||
messages.success(
|
||||
self.request, f"Данные успешно загружены! Обработано строк: {result}"
|
||||
)
|
||||
except Exception as e:
|
||||
messages.error(self.request, f"Ошибка при обработке файла: {str(e)}")
|
||||
|
||||
return redirect("mainapp:load_excel_data")
|
||||
|
||||
def get_success_url(self):
|
||||
return reverse_lazy("mainapp:load_excel_data")
|
||||
|
||||
|
||||
class LoadCsvDataView(LoginRequiredMixin, FormMessageMixin, FormView):
|
||||
"""View for loading data from CSV files."""
|
||||
|
||||
template_name = "mainapp/add_data_from_csv.html"
|
||||
form_class = LoadCsvData
|
||||
success_message = "Данные успешно загружены!"
|
||||
error_message = "Форма заполнена некорректно"
|
||||
|
||||
def form_valid(self, form):
|
||||
uploaded_file = self.request.FILES["file"]
|
||||
try:
|
||||
content = uploaded_file.read()
|
||||
if isinstance(content, bytes):
|
||||
content = content.decode("utf-8")
|
||||
|
||||
get_points_from_csv(content, self.request.user.customuser)
|
||||
except Exception as e:
|
||||
messages.error(self.request, f"Ошибка при обработке файла: {str(e)}")
|
||||
return redirect("mainapp:load_csv_data")
|
||||
|
||||
return super().form_valid(form)
|
||||
|
||||
def get_success_url(self):
|
||||
return reverse_lazy("mainapp:load_csv_data")
|
||||
|
||||
|
||||
class UploadVchLoadView(LoginRequiredMixin, FormMessageMixin, FormView):
|
||||
"""View for uploading VCH load data from HTML files."""
|
||||
|
||||
template_name = "mainapp/upload_html.html"
|
||||
form_class = UploadVchLoad
|
||||
success_message = "Файл успешно обработан"
|
||||
error_message = "Форма заполнена некорректно"
|
||||
|
||||
def form_valid(self, form):
|
||||
selected_sat = form.cleaned_data["sat_choice"]
|
||||
uploaded_file = self.request.FILES["file"]
|
||||
try:
|
||||
get_vch_load_from_html(uploaded_file, selected_sat)
|
||||
except ValueError as e:
|
||||
messages.error(self.request, f"Ошибка при чтении таблиц: {e}")
|
||||
return redirect("mainapp:vch_load")
|
||||
except Exception as e:
|
||||
messages.error(self.request, f"Неизвестная ошибка: {e}")
|
||||
return redirect("mainapp:vch_load")
|
||||
|
||||
return super().form_valid(form)
|
||||
|
||||
def get_success_url(self):
|
||||
return reverse_lazy("mainapp:vch_load")
|
||||
|
||||
|
||||
class LinkVchSigmaView(LoginRequiredMixin, FormView):
|
||||
"""View for linking VCH data with Sigma parameters."""
|
||||
|
||||
template_name = "mainapp/link_vch.html"
|
||||
form_class = VchLinkForm
|
||||
|
||||
def form_valid(self, form):
|
||||
# value1 is no longer used - frequency tolerance is determined automatically
|
||||
freq_range = form.cleaned_data["value2"]
|
||||
sat_id = form.cleaned_data["sat_choice"]
|
||||
|
||||
# Pass 0 for eps_freq and ku_range as they are not used
|
||||
count_all, link_count = compare_and_link_vch_load(sat_id, 0, freq_range, 0)
|
||||
|
||||
messages.success(
|
||||
self.request, f"Привязано {link_count} из {count_all} объектов"
|
||||
)
|
||||
return redirect("mainapp:link_vch_sigma")
|
||||
|
||||
def form_invalid(self, form):
|
||||
return self.render_to_response(self.get_context_data(form=form))
|
||||
|
||||
|
||||
class ProcessKubsatView(LoginRequiredMixin, FormMessageMixin, FormView):
|
||||
"""View for processing Kubsat event data."""
|
||||
|
||||
template_name = "mainapp/process_kubsat.html"
|
||||
form_class = NewEventForm
|
||||
error_message = "Форма заполнена некорректно"
|
||||
|
||||
def form_valid(self, form):
|
||||
uploaded_file = self.request.FILES["file"]
|
||||
try:
|
||||
content = uploaded_file.read()
|
||||
df = kub_report(BytesIO(content))
|
||||
output = BytesIO()
|
||||
with pd.ExcelWriter(output, engine="openpyxl") as writer:
|
||||
df.to_excel(writer, index=False, sheet_name="Результат")
|
||||
output.seek(0)
|
||||
|
||||
response = HttpResponse(
|
||||
output.getvalue(),
|
||||
content_type="application/vnd.openxmlformats-officedocument.spreadsheetml.sheet",
|
||||
)
|
||||
response["Content-Disposition"] = (
|
||||
'attachment; filename="kubsat_report.xlsx"'
|
||||
)
|
||||
|
||||
messages.success(self.request, "Событие успешно обработано!")
|
||||
return response
|
||||
except Exception as e:
|
||||
messages.error(self.request, f"Ошибка при обработке файла: {str(e)}")
|
||||
return redirect("mainapp:kubsat_excel")
|
||||
Reference in New Issue
Block a user