Снова улучшения и добавления

This commit is contained in:
2025-11-14 11:41:19 +03:00
parent 6a26991dc0
commit d61236dee2
12 changed files with 345 additions and 21 deletions

View File

@@ -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