Добавил теханализ
This commit is contained in:
@@ -400,6 +400,9 @@ def fill_data_from_df(df: pd.DataFrame, sat: Satellite, current_user=None, is_au
|
||||
def _create_objitem_from_row(row, sat, source, user_to_use, consts, is_automatic=False):
|
||||
"""
|
||||
Вспомогательная функция для создания ObjItem из строки DataFrame.
|
||||
|
||||
Теперь ищет дополнительные данные (модуляция, стандарт, символьная скорость)
|
||||
в таблице TechAnalyze по имени источника и спутнику, если они не указаны в Excel.
|
||||
|
||||
Args:
|
||||
row: строка DataFrame
|
||||
@@ -420,7 +423,7 @@ def _create_objitem_from_row(row, sat, source, user_to_use, consts, is_automatic
|
||||
except KeyError:
|
||||
polarization_obj, _ = Polarization.objects.get_or_create(name="-")
|
||||
|
||||
# Обработка ВЧ параметров
|
||||
# Обработка ВЧ параметров из Excel
|
||||
freq = remove_str(row["Частота, МГц"])
|
||||
freq_line = remove_str(row["Полоса, МГц"])
|
||||
v = remove_str(row["Символьная скорость, БОД"])
|
||||
@@ -429,8 +432,42 @@ def _create_objitem_from_row(row, sat, source, user_to_use, consts, is_automatic
|
||||
mod_obj, _ = Modulation.objects.get_or_create(name=row["Модуляция"].strip())
|
||||
except AttributeError:
|
||||
mod_obj, _ = Modulation.objects.get_or_create(name="-")
|
||||
|
||||
# Ищем данные в TechAnalyze (если не указаны в Excel или указаны как "-")
|
||||
source_name = row["Объект наблюдения"]
|
||||
tech_data = None
|
||||
|
||||
# Проверяем, нужно ли искать данные в TechAnalyze
|
||||
# (если модуляция "-" или символьная скорость не указана)
|
||||
if mod_obj.name == "-" or v == -1.0:
|
||||
tech_data = _find_tech_analyze_data(source_name, sat)
|
||||
|
||||
# Если нашли данные в TechAnalyze, используем их
|
||||
if tech_data:
|
||||
if mod_obj.name == "-":
|
||||
mod_obj = tech_data['modulation']
|
||||
if v == -1.0:
|
||||
v = tech_data['bod_velocity']
|
||||
|
||||
snr = remove_str(row["ОСШ"])
|
||||
|
||||
# Обработка стандарта (если есть в Excel или из TechAnalyze)
|
||||
try:
|
||||
standard_name = row.get("Стандарт", "-")
|
||||
if pd.isna(standard_name) or standard_name == "-":
|
||||
# Если стандарт не указан в Excel, пытаемся взять из TechAnalyze
|
||||
if tech_data and tech_data['standard']:
|
||||
standard_obj = tech_data['standard']
|
||||
else:
|
||||
standard_obj, _ = Standard.objects.get_or_create(name="-")
|
||||
else:
|
||||
standard_obj, _ = Standard.objects.get_or_create(name=standard_name.strip())
|
||||
except (KeyError, AttributeError):
|
||||
# Если столбца "Стандарт" нет, пытаемся взять из TechAnalyze
|
||||
if tech_data and tech_data['standard']:
|
||||
standard_obj = tech_data['standard']
|
||||
else:
|
||||
standard_obj, _ = Standard.objects.get_or_create(name="-")
|
||||
|
||||
# Обработка времени
|
||||
date = row["Дата"].date()
|
||||
@@ -510,7 +547,7 @@ def _create_objitem_from_row(row, sat, source, user_to_use, consts, is_automatic
|
||||
created_by=user_to_use
|
||||
)
|
||||
|
||||
# Создаем Parameter
|
||||
# Создаем Parameter (с данными из TechAnalyze если они были найдены)
|
||||
Parameter.objects.create(
|
||||
id_satellite=sat,
|
||||
polarization=polarization_obj,
|
||||
@@ -519,6 +556,7 @@ def _create_objitem_from_row(row, sat, source, user_to_use, consts, is_automatic
|
||||
bod_velocity=v,
|
||||
modulation=mod_obj,
|
||||
snr=snr,
|
||||
standard=standard_obj,
|
||||
objitem=obj_item,
|
||||
)
|
||||
|
||||
@@ -817,9 +855,43 @@ def _is_duplicate_objitem(coord_tuple, frequency, freq_range, tolerance=0.1):
|
||||
return False
|
||||
|
||||
|
||||
def _find_tech_analyze_data(name: str, satellite: Satellite):
|
||||
"""
|
||||
Ищет данные технического анализа по имени и спутнику.
|
||||
|
||||
Args:
|
||||
name: имя источника
|
||||
satellite: объект Satellite
|
||||
|
||||
Returns:
|
||||
dict или None: словарь с данными {modulation, standard, bod_velocity} или None
|
||||
"""
|
||||
from .models import TechAnalyze
|
||||
|
||||
try:
|
||||
tech_analyze = TechAnalyze.objects.filter(
|
||||
name=name,
|
||||
satellite=satellite
|
||||
).select_related('modulation', 'standard').first()
|
||||
|
||||
if tech_analyze:
|
||||
return {
|
||||
'modulation': tech_analyze.modulation,
|
||||
'standard': tech_analyze.standard,
|
||||
'bod_velocity': tech_analyze.bod_velocity if tech_analyze.bod_velocity else -1.0
|
||||
}
|
||||
except Exception as e:
|
||||
print(f"Ошибка при поиске TechAnalyze для {name}: {e}")
|
||||
|
||||
return None
|
||||
|
||||
|
||||
def _create_objitem_from_csv_row(row, source, user_to_use, is_automatic=False):
|
||||
"""
|
||||
Вспомогательная функция для создания ObjItem из строки CSV DataFrame.
|
||||
|
||||
Теперь ищет дополнительные данные (модуляция, стандарт, символьная скорость)
|
||||
в таблице TechAnalyze по имени источника и спутнику.
|
||||
|
||||
Args:
|
||||
row: строка DataFrame
|
||||
@@ -845,6 +917,9 @@ def _create_objitem_from_csv_row(row, source, user_to_use, is_automatic=False):
|
||||
name=row["sat"], defaults={"norad": row["norad_id"]}
|
||||
)
|
||||
|
||||
# Ищем данные в TechAnalyze
|
||||
tech_data = _find_tech_analyze_data(row["obj"], sat_obj)
|
||||
|
||||
# Обработка зеркал - теперь это спутники
|
||||
mirror_names = []
|
||||
if not pd.isna(row["mir_1"]) and row["mir_1"].strip() != "-":
|
||||
@@ -901,14 +976,28 @@ def _create_objitem_from_csv_row(row, source, user_to_use, is_automatic=False):
|
||||
created_by=user_to_use
|
||||
)
|
||||
|
||||
# Создаем Parameter
|
||||
Parameter.objects.create(
|
||||
id_satellite=sat_obj,
|
||||
polarization=pol_obj,
|
||||
frequency=row["freq"],
|
||||
freq_range=row["f_range"],
|
||||
objitem=obj_item,
|
||||
)
|
||||
# Создаем Parameter с данными из TechAnalyze (если найдены)
|
||||
if tech_data:
|
||||
# Используем данные из TechAnalyze
|
||||
Parameter.objects.create(
|
||||
id_satellite=sat_obj,
|
||||
polarization=pol_obj,
|
||||
frequency=row["freq"],
|
||||
freq_range=row["f_range"],
|
||||
bod_velocity=tech_data['bod_velocity'],
|
||||
modulation=tech_data['modulation'],
|
||||
standard=tech_data['standard'],
|
||||
objitem=obj_item,
|
||||
)
|
||||
else:
|
||||
# Создаем без дополнительных данных (как раньше)
|
||||
Parameter.objects.create(
|
||||
id_satellite=sat_obj,
|
||||
polarization=pol_obj,
|
||||
frequency=row["freq"],
|
||||
freq_range=row["f_range"],
|
||||
objitem=obj_item,
|
||||
)
|
||||
|
||||
# Связываем geo с objitem
|
||||
geo_obj.objitem = obj_item
|
||||
|
||||
Reference in New Issue
Block a user