Внёс мелкие правки и фиксы
This commit is contained in:
@@ -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()
|
||||
|
||||
Reference in New Issue
Block a user