Добавил работу с заявками на кубсат

This commit is contained in:
2025-12-08 15:37:23 +03:00
parent 2b856ff6dc
commit 8fb8b08c93
15 changed files with 3725 additions and 8 deletions

View File

@@ -913,3 +913,134 @@ class SatelliteForm(forms.ModelForm):
raise forms.ValidationError('Спутник с таким названием уже существует')
return name
class SourceRequestForm(forms.ModelForm):
"""
Форма для создания и редактирования заявок на источники.
"""
# Дополнительные поля для координат
coords_lat = forms.FloatField(
required=False,
label='Широта',
widget=forms.NumberInput(attrs={
'class': 'form-control',
'step': '0.000001',
'placeholder': 'Например: 55.751244'
})
)
coords_lon = forms.FloatField(
required=False,
label='Долгота',
widget=forms.NumberInput(attrs={
'class': 'form-control',
'step': '0.000001',
'placeholder': 'Например: 37.618423'
})
)
class Meta:
from .models import SourceRequest
model = SourceRequest
fields = [
'source',
'status',
'priority',
'planned_at',
'request_date',
'gso_success',
'kubsat_success',
'comment',
]
widgets = {
'source': forms.Select(attrs={
'class': 'form-select',
'required': True
}),
'status': forms.Select(attrs={
'class': 'form-select'
}),
'priority': forms.Select(attrs={
'class': 'form-select'
}),
'planned_at': forms.DateTimeInput(attrs={
'class': 'form-control',
'type': 'datetime-local'
}),
'request_date': forms.DateInput(attrs={
'class': 'form-control',
'type': 'date'
}),
'gso_success': forms.Select(
choices=[(None, '-'), (True, 'Да'), (False, 'Нет')],
attrs={'class': 'form-select'}
),
'kubsat_success': forms.Select(
choices=[(None, '-'), (True, 'Да'), (False, 'Нет')],
attrs={'class': 'form-select'}
),
'comment': forms.Textarea(attrs={
'class': 'form-control',
'rows': 3,
'placeholder': 'Введите комментарий'
}),
}
labels = {
'source': 'Источник',
'status': 'Статус',
'priority': 'Приоритет',
'planned_at': 'Дата и время планирования',
'request_date': 'Дата заявки',
'gso_success': 'ГСО успешно?',
'kubsat_success': 'Кубсат успешно?',
'comment': 'Комментарий',
}
def __init__(self, *args, **kwargs):
# Извлекаем source_id если передан
source_id = kwargs.pop('source_id', None)
super().__init__(*args, **kwargs)
# Загружаем queryset для источников
self.fields['source'].queryset = Source.objects.all().order_by('-id')
# Если передан source_id, устанавливаем его как начальное значение
if source_id:
self.fields['source'].initial = source_id
# Можно сделать поле только для чтения
self.fields['source'].widget.attrs['readonly'] = True
# Настраиваем виджеты для булевых полей
self.fields['gso_success'].widget = forms.Select(
choices=[(None, '-'), (True, 'Да'), (False, 'Нет')],
attrs={'class': 'form-select'}
)
self.fields['kubsat_success'].widget = forms.Select(
choices=[(None, '-'), (True, 'Да'), (False, 'Нет')],
attrs={'class': 'form-select'}
)
# Заполняем координаты из существующего объекта
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
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')
if coords_lat is not None and coords_lon is not None:
instance.coords = Point(coords_lon, coords_lat, srid=4326)
elif coords_lat is None and coords_lon is None:
instance.coords = None
if commit:
instance.save()
return instance