Внёс мелкие правки и фиксы

This commit is contained in:
2025-11-21 10:31:26 +03:00
parent c2c8c8799f
commit 58838614a5
13 changed files with 423 additions and 99 deletions

View File

@@ -40,10 +40,18 @@ class KubsatView(LoginRequiredMixin, FormView):
for source in sources:
source_data = {
'source': source,
'objitems_data': []
'objitems_data': [],
'has_lyngsat': False,
'lyngsat_id': None
}
for objitem in source.source_objitems.all():
# Check if objitem has LyngSat source
if hasattr(objitem, 'lyngsat_source') and objitem.lyngsat_source:
source_data['has_lyngsat'] = True
source_data['lyngsat_id'] = objitem.lyngsat_source.id
objitem_matches_date = True
objitem_matches_date = True
geo_date = None
@@ -91,11 +99,12 @@ class KubsatView(LoginRequiredMixin, FormView):
def apply_filters(self, filters):
"""Применяет фильтры к queryset Source"""
queryset = Source.objects.select_related('info').prefetch_related(
queryset = Source.objects.select_related('info', 'ownership').prefetch_related(
'source_objitems__parameter_obj__id_satellite',
'source_objitems__parameter_obj__polarization',
'source_objitems__parameter_obj__modulation',
'source_objitems__transponder__sat_id'
'source_objitems__transponder__sat_id',
'source_objitems__lyngsat_source'
).annotate(objitem_count=Count('source_objitems'))
# Фильтр по спутникам
@@ -146,6 +155,10 @@ class KubsatView(LoginRequiredMixin, FormView):
if filters.get('object_type'):
queryset = queryset.filter(info__in=filters['object_type'])
# Фильтр по принадлежности объекта
if filters.get('object_ownership'):
queryset = queryset.filter(ownership__in=filters['object_ownership'])
# Фильтр по количеству ObjItem
objitem_count = filters.get('objitem_count')
if objitem_count == '1':
@@ -191,13 +204,37 @@ class KubsatExportView(LoginRequiredMixin, FormView):
}
sources_objitems[objitem.source.id]['objitems'].append(objitem)
# Создаем Excel файл
# Создаем Excel файл с двумя листами
wb = Workbook()
ws = wb.active
ws.title = "Кубсат"
# Заголовки
headers = [
# Первый лист: "Предложения" (только основные данные)
ws_proposals = wb.active
ws_proposals.title = "Предложения"
# Заголовки для листа "Предложения"
headers_proposals = [
'Дата',
'Широта, град',
'Долгота, град',
'Высота, м',
'Местоположение',
'ИСЗ',
'Прямой канал, МГц',
'Обратный канал, МГц',
'Перенос'
]
# Стиль заголовков для листа "Предложения"
for col_num, header in enumerate(headers_proposals, 1):
cell = ws_proposals.cell(row=1, column=col_num, value=header)
cell.font = Font(bold=True)
cell.alignment = Alignment(horizontal='center', vertical='center')
# Второй лист: "Комментарий" (все данные)
ws_comments = wb.create_sheet(title="Комментарий")
# Заголовки для листа "Комментарий"
headers_comments = [
'Дата',
'Широта, град',
'Долгота, град',
@@ -215,9 +252,9 @@ class KubsatExportView(LoginRequiredMixin, FormView):
'Оператор'
]
# Стиль заголовков
for col_num, header in enumerate(headers, 1):
cell = ws.cell(row=1, column=col_num, value=header)
# Стиль заголовков для листа "Комментарий"
for col_num, header in enumerate(headers_comments, 1):
cell = ws_comments.cell(row=1, column=col_num, value=header)
cell.font = Font(bold=True)
cell.alignment = Alignment(horizontal='center', vertical='center')
@@ -225,7 +262,8 @@ class KubsatExportView(LoginRequiredMixin, FormView):
current_date = datetime.now().strftime('%d.%m.%Y')
operator_name = f"{request.user.first_name} {request.user.last_name}" if request.user.first_name else request.user.username
row_num = 2
row_num_proposals = 2
row_num_comments = 2
for source_id, data in sources_objitems.items():
source = data['source']
objitems_list = data['objitems']
@@ -315,37 +353,50 @@ class KubsatExportView(LoginRequiredMixin, FormView):
# Иначе показываем диапазон
date_range_str = f"{min_date_str}-{max_date_str}"
# Записываем строку
ws.cell(row=row_num, column=1, value=current_date)
ws.cell(row=row_num, column=2, value=latitude)
ws.cell(row=row_num, column=3, value=longitude)
ws.cell(row=row_num, column=4, value=0.0)
ws.cell(row=row_num, column=5, value=location)
ws.cell(row=row_num, column=6, value=satellite_info)
ws.cell(row=row_num, column=7, value=direct_channel)
ws.cell(row=row_num, column=8, value=reverse_channel)
ws.cell(row=row_num, column=9, value=transfer)
ws.cell(row=row_num, column=10, value=objitem_count)
ws.cell(row=row_num, column=11, value=date_range_str)
ws.cell(row=row_num, column=12, value=mirrors_str)
ws.cell(row=row_num, column=13, value='')
ws.cell(row=row_num, column=14, value='')
ws.cell(row=row_num, column=15, value=operator_name)
# Записываем строку на лист "Предложения" (только основные данные)
ws_proposals.cell(row=row_num_proposals, column=1, value=current_date)
ws_proposals.cell(row=row_num_proposals, column=2, value=latitude)
ws_proposals.cell(row=row_num_proposals, column=3, value=longitude)
ws_proposals.cell(row=row_num_proposals, column=4, value=0.0)
ws_proposals.cell(row=row_num_proposals, column=5, value=location)
ws_proposals.cell(row=row_num_proposals, column=6, value=satellite_info)
ws_proposals.cell(row=row_num_proposals, column=7, value=direct_channel)
ws_proposals.cell(row=row_num_proposals, column=8, value=reverse_channel)
ws_proposals.cell(row=row_num_proposals, column=9, value=transfer)
row_num += 1
# Записываем строку на лист "Комментарий" (все данные)
ws_comments.cell(row=row_num_comments, column=1, value=current_date)
ws_comments.cell(row=row_num_comments, column=2, value=latitude)
ws_comments.cell(row=row_num_comments, column=3, value=longitude)
ws_comments.cell(row=row_num_comments, column=4, value=0.0)
ws_comments.cell(row=row_num_comments, column=5, value=location)
ws_comments.cell(row=row_num_comments, column=6, value=satellite_info)
ws_comments.cell(row=row_num_comments, column=7, value=direct_channel)
ws_comments.cell(row=row_num_comments, column=8, value=reverse_channel)
ws_comments.cell(row=row_num_comments, column=9, value=transfer)
ws_comments.cell(row=row_num_comments, column=10, value=objitem_count)
ws_comments.cell(row=row_num_comments, column=11, value=date_range_str)
ws_comments.cell(row=row_num_comments, column=12, value=mirrors_str)
ws_comments.cell(row=row_num_comments, column=13, value='')
ws_comments.cell(row=row_num_comments, column=14, value='')
ws_comments.cell(row=row_num_comments, column=15, value=operator_name)
row_num_proposals += 1
row_num_comments += 1
# Автоширина колонок
for column in ws.columns:
max_length = 0
column_letter = column[0].column_letter
for cell in column:
try:
if len(str(cell.value)) > max_length:
max_length = len(str(cell.value))
except:
pass
adjusted_width = min(max_length + 2, 50)
ws.column_dimensions[column_letter].width = adjusted_width
# Автоширина колонок для обоих листов
for ws in [ws_proposals, ws_comments]:
for column in ws.columns:
max_length = 0
column_letter = column[0].column_letter
for cell in column:
try:
if len(str(cell.value)) > max_length:
max_length = len(str(cell.value))
except:
pass
adjusted_width = min(max_length + 2, 50)
ws.column_dimensions[column_letter].width = adjusted_width
# Сохраняем в BytesIO
output = BytesIO()