diff --git a/dbapp/mainapp/templates/mainapp/tech_analyze_list.html b/dbapp/mainapp/templates/mainapp/tech_analyze_list.html
index 570df5d..178f0dd 100644
--- a/dbapp/mainapp/templates/mainapp/tech_analyze_list.html
+++ b/dbapp/mainapp/templates/mainapp/tech_analyze_list.html
@@ -138,7 +138,17 @@
- Будут обновлены только точки с отсутствующими данными (модуляция "-", символьная скорость -1 или 0, стандарт "-").
+
Будут обновлены точки с отсутствующими данными:
+
+ - Модуляция (если "-")
+ - Символьная скорость (если -1, 0 или пусто)
+ - Стандарт (если "-")
+ - Частота (если 0, -1 или пусто)
+ - Полоса частот (если 0, -1 или пусто)
+ - Поляризация (если "-")
+ - Транспондер (если не привязан)
+ - Источник LyngSat (если не привязан)
+
diff --git a/dbapp/mainapp/views/tech_analyze.py b/dbapp/mainapp/views/tech_analyze.py
index 62ba809..356c7cc 100644
--- a/dbapp/mainapp/views/tech_analyze.py
+++ b/dbapp/mainapp/views/tech_analyze.py
@@ -19,7 +19,7 @@ from ..models import (
Parameter,
)
from ..mixins import RoleRequiredMixin
-from ..utils import parse_pagination_params
+from ..utils import parse_pagination_params, find_matching_transponder, find_matching_lyngsat
class TechAnalyzeEntryView(LoginRequiredMixin, View):
@@ -190,6 +190,9 @@ class LinkExistingPointsView(LoginRequiredMixin, View):
* Обновить модуляцию (если "-")
* Обновить символьную скорость (если -1.0 или None)
* Обновить стандарт (если "-")
+ * Обновить частоту (если 0 или None)
+ * Обновить полосу частот (если 0 или None)
+ * Подобрать подходящий транспондер
"""
def post(self, request):
@@ -214,7 +217,7 @@ class LinkExistingPointsView(LoginRequiredMixin, View):
# Получаем все ObjItem для данного спутника
objitems = ObjItem.objects.filter(
parameter_obj__id_satellite=satellite
- ).select_related('parameter_obj', 'parameter_obj__modulation', 'parameter_obj__standard')
+ ).select_related('parameter_obj', 'parameter_obj__modulation', 'parameter_obj__standard', 'parameter_obj__polarization')
updated_count = 0
skipped_count = 0
@@ -236,7 +239,14 @@ class LinkExistingPointsView(LoginRequiredMixin, View):
parameter.bod_velocity is None or
parameter.bod_velocity == -1.0 or
parameter.bod_velocity == 0 or
- (parameter.standard and parameter.standard.name == "-")
+ (parameter.standard and parameter.standard.name == "-") or
+ parameter.frequency is None or
+ parameter.frequency == 0 or
+ parameter.frequency == -1.0 or
+ parameter.freq_range is None or
+ parameter.freq_range == 0 or
+ parameter.freq_range == -1.0 or
+ objitem.transponder is None
)
if not needs_update:
@@ -247,7 +257,7 @@ class LinkExistingPointsView(LoginRequiredMixin, View):
tech_analyze = TechAnalyze.objects.filter(
name=source_name,
satellite=satellite
- ).select_related('modulation', 'standard').first()
+ ).select_related('modulation', 'standard', 'polarization').first()
if not tech_analyze:
skipped_count += 1
@@ -272,8 +282,55 @@ class LinkExistingPointsView(LoginRequiredMixin, View):
parameter.standard = tech_analyze.standard
updated = True
+ # Обновляем частоту
+ if (parameter.frequency is None or parameter.frequency == 0 or parameter.frequency == -1.0) and \
+ tech_analyze.frequency and tech_analyze.frequency > 0:
+ parameter.frequency = tech_analyze.frequency
+ updated = True
+
+ # Обновляем полосу частот
+ if (parameter.freq_range is None or parameter.freq_range == 0 or parameter.freq_range == -1.0) and \
+ tech_analyze.freq_range and tech_analyze.freq_range > 0:
+ parameter.freq_range = tech_analyze.freq_range
+ updated = True
+
+ # Обновляем поляризацию если нужно
+ if parameter.polarization and parameter.polarization.name == "-" and tech_analyze.polarization:
+ parameter.polarization = tech_analyze.polarization
+ updated = True
+
+ # Сохраняем parameter перед поиском транспондера (чтобы использовать обновленные данные)
if updated:
parameter.save()
+
+ # Подбираем транспондер если его нет (используем функцию из utils)
+ if objitem.transponder is None and parameter.frequency and parameter.frequency > 0:
+ transponder = find_matching_transponder(
+ satellite,
+ parameter.frequency,
+ parameter.polarization
+ )
+ if transponder:
+ objitem.transponder = transponder
+ updated = True
+
+ # Подбираем источник LyngSat если его нет (используем функцию из utils)
+ if objitem.lyngsat_source is None and parameter.frequency and parameter.frequency > 0:
+ lyngsat_source = find_matching_lyngsat(
+ satellite,
+ parameter.frequency,
+ parameter.polarization,
+ tolerance_mhz=0.1
+ )
+ if lyngsat_source:
+ objitem.lyngsat_source = lyngsat_source
+ updated = True
+
+ # Сохраняем objitem если были изменения транспондера или lyngsat
+ if objitem.transponder or objitem.lyngsat_source:
+ objitem.save()
+
+ if updated:
updated_count += 1
else:
skipped_count += 1
@@ -305,7 +362,6 @@ class LinkExistingPointsView(LoginRequiredMixin, View):
}, status=500)
-
class TechAnalyzeListView(LoginRequiredMixin, View):
"""
Представление для отображения списка данных технического анализа.