Доделал таблицу с кубсатом
This commit is contained in:
@@ -926,10 +926,10 @@ class SourceRequestForm(forms.ModelForm):
|
||||
Форма для создания и редактирования заявок на источники.
|
||||
"""
|
||||
|
||||
# Дополнительные поля для координат
|
||||
# Дополнительные поля для координат ГСО
|
||||
coords_lat = forms.FloatField(
|
||||
required=False,
|
||||
label='Широта',
|
||||
label='Широта ГСО',
|
||||
widget=forms.NumberInput(attrs={
|
||||
'class': 'form-control',
|
||||
'step': '0.000001',
|
||||
@@ -938,7 +938,27 @@ class SourceRequestForm(forms.ModelForm):
|
||||
)
|
||||
coords_lon = forms.FloatField(
|
||||
required=False,
|
||||
label='Долгота',
|
||||
label='Долгота ГСО',
|
||||
widget=forms.NumberInput(attrs={
|
||||
'class': 'form-control',
|
||||
'step': '0.000001',
|
||||
'placeholder': 'Например: 37.618423'
|
||||
})
|
||||
)
|
||||
|
||||
# Дополнительные поля для координат источника
|
||||
coords_source_lat = forms.FloatField(
|
||||
required=False,
|
||||
label='Широта источника',
|
||||
widget=forms.NumberInput(attrs={
|
||||
'class': 'form-control',
|
||||
'step': '0.000001',
|
||||
'placeholder': 'Например: 55.751244'
|
||||
})
|
||||
)
|
||||
coords_source_lon = forms.FloatField(
|
||||
required=False,
|
||||
label='Долгота источника',
|
||||
widget=forms.NumberInput(attrs={
|
||||
'class': 'form-control',
|
||||
'step': '0.000001',
|
||||
@@ -951,10 +971,16 @@ class SourceRequestForm(forms.ModelForm):
|
||||
model = SourceRequest
|
||||
fields = [
|
||||
'source',
|
||||
'satellite',
|
||||
'status',
|
||||
'priority',
|
||||
'planned_at',
|
||||
'request_date',
|
||||
'card_date',
|
||||
'downlink',
|
||||
'uplink',
|
||||
'transfer',
|
||||
'region',
|
||||
'gso_success',
|
||||
'kubsat_success',
|
||||
'comment',
|
||||
@@ -962,7 +988,9 @@ class SourceRequestForm(forms.ModelForm):
|
||||
widgets = {
|
||||
'source': forms.Select(attrs={
|
||||
'class': 'form-select',
|
||||
'required': True
|
||||
}),
|
||||
'satellite': forms.Select(attrs={
|
||||
'class': 'form-select',
|
||||
}),
|
||||
'status': forms.Select(attrs={
|
||||
'class': 'form-select'
|
||||
@@ -978,6 +1006,29 @@ class SourceRequestForm(forms.ModelForm):
|
||||
'class': 'form-control',
|
||||
'type': 'date'
|
||||
}),
|
||||
'card_date': forms.DateInput(attrs={
|
||||
'class': 'form-control',
|
||||
'type': 'date'
|
||||
}),
|
||||
'downlink': forms.NumberInput(attrs={
|
||||
'class': 'form-control',
|
||||
'step': '0.01',
|
||||
'placeholder': 'Частота downlink в МГц'
|
||||
}),
|
||||
'uplink': forms.NumberInput(attrs={
|
||||
'class': 'form-control',
|
||||
'step': '0.01',
|
||||
'placeholder': 'Частота uplink в МГц'
|
||||
}),
|
||||
'transfer': forms.NumberInput(attrs={
|
||||
'class': 'form-control',
|
||||
'step': '0.01',
|
||||
'placeholder': 'Перенос в МГц'
|
||||
}),
|
||||
'region': forms.TextInput(attrs={
|
||||
'class': 'form-control',
|
||||
'placeholder': 'Район/местоположение'
|
||||
}),
|
||||
'gso_success': forms.Select(
|
||||
choices=[(None, '-'), (True, 'Да'), (False, 'Нет')],
|
||||
attrs={'class': 'form-select'}
|
||||
@@ -994,10 +1045,16 @@ class SourceRequestForm(forms.ModelForm):
|
||||
}
|
||||
labels = {
|
||||
'source': 'Источник',
|
||||
'satellite': 'Спутник',
|
||||
'status': 'Статус',
|
||||
'priority': 'Приоритет',
|
||||
'planned_at': 'Дата и время планирования',
|
||||
'request_date': 'Дата заявки',
|
||||
'card_date': 'Дата формирования карточки',
|
||||
'downlink': 'Частота Downlink (МГц)',
|
||||
'uplink': 'Частота Uplink (МГц)',
|
||||
'transfer': 'Перенос (МГц)',
|
||||
'region': 'Район',
|
||||
'gso_success': 'ГСО успешно?',
|
||||
'kubsat_success': 'Кубсат успешно?',
|
||||
'comment': 'Комментарий',
|
||||
@@ -1008,14 +1065,23 @@ class SourceRequestForm(forms.ModelForm):
|
||||
source_id = kwargs.pop('source_id', None)
|
||||
super().__init__(*args, **kwargs)
|
||||
|
||||
# Загружаем queryset для источников
|
||||
# Загружаем queryset для источников и спутников
|
||||
self.fields['source'].queryset = Source.objects.all().order_by('-id')
|
||||
self.fields['source'].required = False
|
||||
self.fields['satellite'].queryset = Satellite.objects.all().order_by('name')
|
||||
|
||||
# Если передан source_id, устанавливаем его как начальное значение
|
||||
if source_id:
|
||||
self.fields['source'].initial = source_id
|
||||
# Можно сделать поле только для чтения
|
||||
self.fields['source'].widget.attrs['readonly'] = True
|
||||
|
||||
# Пытаемся заполнить данные из источника
|
||||
try:
|
||||
source = Source.objects.get(pk=source_id)
|
||||
self._fill_from_source(source)
|
||||
except Source.DoesNotExist:
|
||||
pass
|
||||
|
||||
# Настраиваем виджеты для булевых полей
|
||||
self.fields['gso_success'].widget = forms.Select(
|
||||
@@ -1028,16 +1094,44 @@ class SourceRequestForm(forms.ModelForm):
|
||||
)
|
||||
|
||||
# Заполняем координаты из существующего объекта
|
||||
if self.instance and self.instance.pk and self.instance.coords:
|
||||
self.fields['coords_lat'].initial = self.instance.coords.y
|
||||
self.fields['coords_lon'].initial = self.instance.coords.x
|
||||
if self.instance and self.instance.pk:
|
||||
if self.instance.coords:
|
||||
self.fields['coords_lat'].initial = self.instance.coords.y
|
||||
self.fields['coords_lon'].initial = self.instance.coords.x
|
||||
if self.instance.coords_source:
|
||||
self.fields['coords_source_lat'].initial = self.instance.coords_source.y
|
||||
self.fields['coords_source_lon'].initial = self.instance.coords_source.x
|
||||
|
||||
def _fill_from_source(self, source):
|
||||
"""Заполняет поля формы данными из источника и его связанных объектов."""
|
||||
# Получаем первую точку источника с транспондером
|
||||
objitem = source.source_objitems.select_related(
|
||||
'transponder', 'transponder__sat_id', 'parameter_obj'
|
||||
).filter(transponder__isnull=False).first()
|
||||
|
||||
if objitem and objitem.transponder:
|
||||
transponder = objitem.transponder
|
||||
# Заполняем данные из транспондера
|
||||
if transponder.downlink:
|
||||
self.fields['downlink'].initial = transponder.downlink
|
||||
if transponder.uplink:
|
||||
self.fields['uplink'].initial = transponder.uplink
|
||||
if transponder.transfer:
|
||||
self.fields['transfer'].initial = transponder.transfer
|
||||
if transponder.sat_id:
|
||||
self.fields['satellite'].initial = transponder.sat_id.pk
|
||||
|
||||
# Координаты из источника
|
||||
if source.coords_average:
|
||||
self.fields['coords_lat'].initial = source.coords_average.y
|
||||
self.fields['coords_lon'].initial = source.coords_average.x
|
||||
|
||||
def save(self, commit=True):
|
||||
from django.contrib.gis.geos import Point
|
||||
|
||||
instance = super().save(commit=False)
|
||||
|
||||
# Обрабатываем координаты
|
||||
# Обрабатываем координаты ГСО
|
||||
coords_lat = self.cleaned_data.get('coords_lat')
|
||||
coords_lon = self.cleaned_data.get('coords_lon')
|
||||
|
||||
@@ -1046,6 +1140,15 @@ class SourceRequestForm(forms.ModelForm):
|
||||
elif coords_lat is None and coords_lon is None:
|
||||
instance.coords = None
|
||||
|
||||
# Обрабатываем координаты источника
|
||||
coords_source_lat = self.cleaned_data.get('coords_source_lat')
|
||||
coords_source_lon = self.cleaned_data.get('coords_source_lon')
|
||||
|
||||
if coords_source_lat is not None and coords_source_lon is not None:
|
||||
instance.coords_source = Point(coords_source_lon, coords_source_lat, srid=4326)
|
||||
elif coords_source_lat is None and coords_source_lon is None:
|
||||
instance.coords_source = None
|
||||
|
||||
if commit:
|
||||
instance.save()
|
||||
|
||||
|
||||
Reference in New Issue
Block a user