Снова улучшения и добавления
This commit is contained in:
@@ -28,6 +28,47 @@ from .models import (
|
||||
Standard,
|
||||
)
|
||||
|
||||
|
||||
def find_matching_transponder(satellite, frequency, polarization):
|
||||
"""
|
||||
Находит подходящий транспондер для заданных параметров.
|
||||
|
||||
Алгоритм:
|
||||
1. Фильтрует транспондеры по спутнику и поляризации
|
||||
2. Проверяет, входит ли частота в диапазон транспондера:
|
||||
downlink - frequency_range/2 <= frequency <= downlink + frequency_range/2
|
||||
3. Возвращает самый свежий транспондер (по created_at)
|
||||
|
||||
Args:
|
||||
satellite: объект Satellite
|
||||
frequency: частота в МГц
|
||||
polarization: объект Polarization
|
||||
|
||||
Returns:
|
||||
Transponders или None: найденный транспондер или None
|
||||
"""
|
||||
if not satellite or not polarization or frequency == -1.0:
|
||||
return None
|
||||
|
||||
# Фильтруем транспондеры по спутнику и поляризации
|
||||
transponders = Transponders.objects.filter(
|
||||
sat_id=satellite,
|
||||
polarization=polarization,
|
||||
downlink__isnull=False,
|
||||
frequency_range__isnull=False
|
||||
).annotate(
|
||||
# Вычисляем нижнюю и верхнюю границы диапазона
|
||||
lower_bound=F('downlink') - F('frequency_range') / 2,
|
||||
upper_bound=F('downlink') + F('frequency_range') / 2
|
||||
).filter(
|
||||
# Проверяем, входит ли частота в диапазон
|
||||
lower_bound__lte=frequency,
|
||||
upper_bound__gte=frequency
|
||||
).order_by('-created_at') # Сортируем по дате создания (самые свежие первыми)
|
||||
|
||||
# Возвращаем самый свежий транспондер
|
||||
return transponders.first()
|
||||
|
||||
# ============================================================================
|
||||
# Константы
|
||||
# ============================================================================
|
||||
@@ -371,9 +412,15 @@ def _create_objitem_from_row(row, sat, source, user_to_use, consts):
|
||||
# Пропускаем создание дубликата
|
||||
return
|
||||
|
||||
# Создаем новый ObjItem и связываем с Source
|
||||
# Находим подходящий транспондер
|
||||
transponder = find_matching_transponder(sat, freq, polarization_obj)
|
||||
|
||||
# Создаем новый ObjItem и связываем с Source и Transponder
|
||||
obj_item = ObjItem.objects.create(
|
||||
name=source_name, source=source, created_by=user_to_use
|
||||
name=source_name,
|
||||
source=source,
|
||||
transponder=transponder,
|
||||
created_by=user_to_use
|
||||
)
|
||||
|
||||
# Создаем Parameter
|
||||
@@ -697,9 +744,15 @@ def _create_objitem_from_csv_row(row, source, user_to_use):
|
||||
# Пропускаем создание дубликата
|
||||
return
|
||||
|
||||
# Создаем новый ObjItem и связываем с Source
|
||||
# Находим подходящий транспондер
|
||||
transponder = find_matching_transponder(sat_obj, row["freq"], pol_obj)
|
||||
|
||||
# Создаем новый ObjItem и связываем с Source и Transponder
|
||||
obj_item = ObjItem.objects.create(
|
||||
name=row["obj"], source=source, created_by=user_to_use
|
||||
name=row["obj"],
|
||||
source=source,
|
||||
transponder=transponder,
|
||||
created_by=user_to_use
|
||||
)
|
||||
|
||||
# Создаем Parameter
|
||||
|
||||
Reference in New Issue
Block a user