Поправил csv импорт

This commit is contained in:
2025-12-01 16:42:17 +03:00
parent 8d75e47abc
commit 300927c7ea
2 changed files with 215 additions and 77 deletions

View File

@@ -765,31 +765,37 @@ def get_points_from_csv(file_content, current_user=None, is_automatic=False):
'errors': список ошибок
}
"""
# Читаем CSV без предопределенных имен колонок
df = pd.read_csv(
io.StringIO(file_content),
sep=";",
names=[
"id",
"obj",
"lat",
"lon",
"h",
"time",
"sat",
"norad_id",
"freq",
"f_range",
"et",
"qaul",
"mir_1",
"mir_2",
"mir_3",
"mir_4",
"mir_5",
"mir_6",
"mir_7",
],
header=None
)
# Присваиваем имена первым 12 колонкам
base_columns = [
"id",
"obj",
"lat",
"lon",
"h",
"time",
"sat",
"norad_id",
"freq",
"f_range",
"et",
"qual",
]
# Все колонки после "qual" (индекс 11) - это зеркала
num_columns = len(df.columns)
mirror_columns = [f"mir_{i+1}" for i in range(num_columns - len(base_columns))]
# Объединяем имена колонок
df.columns = base_columns + mirror_columns
# Преобразуем типы данных
df[["lat", "lon", "freq", "f_range"]] = (
df[["lat", "lon", "freq", "f_range"]]
.replace(",", ".", regex=True)
@@ -873,7 +879,7 @@ def get_points_from_csv(file_content, current_user=None, is_automatic=False):
sources_cache[(source_name, sat_name, source.id)] = source
# Создаем ObjItem (с Source или без, в зависимости от is_automatic)
_create_objitem_from_csv_row(row, source, user_to_use, is_automatic)
_create_objitem_from_csv_row(row, source, user_to_use, is_automatic, mirror_columns)
added_count += 1
except Exception as e:
@@ -996,7 +1002,7 @@ def _find_tech_analyze_data(name: str, satellite: Satellite):
return None
def _create_objitem_from_csv_row(row, source, user_to_use, is_automatic=False):
def _create_objitem_from_csv_row(row, source, user_to_use, is_automatic=False, mirror_columns=None):
"""
Вспомогательная функция для создания ObjItem из строки CSV DataFrame.
@@ -1008,6 +1014,7 @@ def _create_objitem_from_csv_row(row, source, user_to_use, is_automatic=False):
source: объект Source для связи (может быть None если is_automatic=True)
user_to_use: пользователь для created_by
is_automatic: если True, точка не связывается с Source
mirror_columns: список имен колонок с зеркалами (optional)
"""
# Определяем поляризацию
match row["obj"].split(" ")[-1]:
@@ -1035,12 +1042,24 @@ def _create_objitem_from_csv_row(row, source, user_to_use, is_automatic=False):
# Обработка зеркал - теперь это спутники
mirror_names = []
if not pd.isna(row["mir_1"]) and row["mir_1"].strip() != "-":
mirror_names.append(row["mir_1"])
if not pd.isna(row["mir_2"]) and row["mir_2"].strip() != "-":
mirror_names.append(row["mir_2"])
if not pd.isna(row["mir_3"]) and row["mir_3"].strip() != "-":
mirror_names.append(row["mir_3"])
# Если переданы имена колонок зеркал, используем их
if mirror_columns:
for mir_col in mirror_columns:
if mir_col in row.index:
mir_value = row[mir_col]
if not pd.isna(mir_value) and str(mir_value).strip() != "-" and str(mir_value).strip() != "":
mirror_names.append(str(mir_value).strip())
else:
# Fallback на старый способ (для обратной совместимости)
for i in range(1, 100): # Проверяем до 100 колонок зеркал
mir_col = f"mir_{i}"
if mir_col in row.index:
mir_value = row[mir_col]
if not pd.isna(mir_value) and str(mir_value).strip() != "-" and str(mir_value).strip() != "":
mirror_names.append(str(mir_value).strip())
else:
break
# Находим спутники-зеркала
mirror_satellites = find_mirror_satellites(mirror_names)