Добавил формы создания и пофиксил баг с пользователями

This commit is contained in:
2025-11-24 23:47:00 +03:00
parent 1c18ae96f7
commit 7879c3d9b5
19 changed files with 448 additions and 183 deletions

View File

@@ -34,7 +34,7 @@ from .lyngsat import (
ClearLyngsatCacheView,
UnlinkAllLyngsatSourcesView,
)
from .source import SourceListView, SourceUpdateView, SourceDeleteView, DeleteSelectedSourcesView
from .source import SourceListView, SourceCreateView, SourceUpdateView, SourceDeleteView, DeleteSelectedSourcesView
from .transponder import (
TransponderListView,
TransponderCreateView,
@@ -97,6 +97,7 @@ __all__ = [
'UnlinkAllLyngsatSourcesView',
# Source
'SourceListView',
'SourceCreateView',
'SourceUpdateView',
'SourceDeleteView',
'DeleteSelectedSourcesView',

View File

@@ -78,6 +78,7 @@ class LoadExcelDataView(LoginRequiredMixin, FormMessageMixin, FormView):
uploaded_file = self.request.FILES["file"]
selected_sat = form.cleaned_data["sat_choice"]
number = form.cleaned_data["number_input"]
is_automatic = form.cleaned_data.get("is_automatic", False)
try:
import io
@@ -85,11 +86,16 @@ class LoadExcelDataView(LoginRequiredMixin, FormMessageMixin, FormView):
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)
result = fill_data_from_df(df, selected_sat, self.request.user.customuser, is_automatic)
messages.success(
self.request, f"Данные успешно загружены! Обработано строк: {result}"
)
if is_automatic:
messages.success(
self.request, f"Данные успешно загружены как автоматические! Добавлено точек: {len(df)}"
)
else:
messages.success(
self.request, f"Данные успешно загружены! Создано источников: {result}"
)
except Exception as e:
messages.error(self.request, f"Ошибка при обработке файла: {str(e)}")
@@ -109,12 +115,19 @@ class LoadCsvDataView(LoginRequiredMixin, FormMessageMixin, FormView):
def form_valid(self, form):
uploaded_file = self.request.FILES["file"]
is_automatic = form.cleaned_data.get("is_automatic", False)
try:
content = uploaded_file.read()
if isinstance(content, bytes):
content = content.decode("utf-8")
get_points_from_csv(content, self.request.user.customuser)
result = get_points_from_csv(content, self.request.user.customuser, is_automatic)
if is_automatic:
messages.success(self.request, "Данные успешно загружены как автоматические!")
else:
messages.success(self.request, f"Данные успешно загружены! Создано источников: {result}")
except Exception as e:
messages.error(self.request, f"Ошибка при обработке файла: {str(e)}")
return redirect("mainapp:load_csv_data")

View File

@@ -286,6 +286,13 @@ class ObjItemListView(LoginRequiredMixin, View):
elif has_sigma == "0":
objects = objects.filter(parameter_obj__sigma_parameter__isnull=True)
# Filter by is_automatic
is_automatic_filter = request.GET.get("is_automatic")
if is_automatic_filter == "1":
objects = objects.filter(is_automatic=True)
elif is_automatic_filter == "0":
objects = objects.filter(is_automatic=False)
if search_query:
search_query = search_query.strip()
if search_query:
@@ -336,6 +343,8 @@ class ObjItemListView(LoginRequiredMixin, View):
"-polarization": "-first_param_pol_name",
"modulation": "first_param_mod_name",
"-modulation": "-first_param_mod_name",
"is_automatic": "is_automatic",
"-is_automatic": "-is_automatic",
}
# Apply sorting if valid, otherwise use default
@@ -467,6 +476,7 @@ class ObjItemListView(LoginRequiredMixin, View):
"has_sigma": has_sigma,
"sigma_info": sigma_info,
"mirrors": ", ".join(mirrors_list) if mirrors_list else "-",
"is_automatic": "Да" if obj.is_automatic else "Нет",
"obj": obj,
}
)
@@ -477,6 +487,7 @@ class ObjItemListView(LoginRequiredMixin, View):
# Get the new filter values
has_source_type = request.GET.get("has_source_type")
has_sigma = request.GET.get("has_sigma")
is_automatic_filter = request.GET.get("is_automatic")
context = {
"satellites": satellites,
@@ -509,6 +520,7 @@ class ObjItemListView(LoginRequiredMixin, View):
"date_to": date_to,
"has_source_type": has_source_type,
"has_sigma": has_sigma,
"is_automatic": is_automatic_filter,
"modulations": modulations,
"polarizations": polarizations,
"full_width_page": True,
@@ -679,6 +691,10 @@ class ObjItemCreateView(ObjItemFormView, CreateView):
success_message = "Объект успешно создан!"
def get_object(self, queryset=None):
"""Return None for create view."""
return None
def set_user_fields(self):
self.object.created_by = self.request.user.customuser
self.object.updated_by = self.request.user.customuser

View File

@@ -752,6 +752,48 @@ class AdminModeratorMixin(UserPassesTestMixin):
return redirect('mainapp:source_list')
class SourceCreateView(LoginRequiredMixin, AdminModeratorMixin, View):
"""View for creating new Source."""
def get(self, request):
form = SourceForm()
context = {
'object': None,
'form': form,
'objitems': [],
'full_width_page': True,
}
return render(request, 'mainapp/source_form.html', context)
def post(self, request):
form = SourceForm(request.POST)
if form.is_valid():
source = form.save(commit=False)
# Set created_by and updated_by to current user
if hasattr(request.user, 'customuser'):
source.created_by = request.user.customuser
source.updated_by = request.user.customuser
source.save()
messages.success(request, f'Источник #{source.id} успешно создан.')
# Redirect to edit page
return redirect('mainapp:source_update', pk=source.id)
# If form is invalid, re-render with errors
context = {
'object': None,
'form': form,
'objitems': [],
'full_width_page': True,
}
return render(request, 'mainapp/source_form.html', context)
class SourceUpdateView(LoginRequiredMixin, AdminModeratorMixin, View):
"""View for editing Source with 4 coordinate fields and related ObjItems."""