Сделал вкладку спутников

This commit is contained in:
2025-11-20 13:44:48 +03:00
parent 1d1c42a8e7
commit c2c8c8799f
10 changed files with 1582 additions and 6 deletions

View File

@@ -549,7 +549,7 @@ class KubsatFilterForm(forms.Form):
"""Форма фильтров для страницы Кубсат"""
satellites = forms.ModelMultipleChoiceField(
queryset=Satellite.objects.all().order_by('name'),
queryset=None, # Будет установлен в __init__
label='Спутники',
required=False,
widget=forms.SelectMultiple(attrs={'class': 'form-select', 'size': '5'})
@@ -617,7 +617,7 @@ class KubsatFilterForm(forms.Form):
objitem_count = forms.ChoiceField(
choices=[('', 'Все'), ('1', '1'), ('2+', '2 и более')],
label='Количество привязанных ObjItem',
label='Количество привязанных точек ГЛ',
required=False,
widget=forms.RadioSelect()
)
@@ -658,7 +658,15 @@ class KubsatFilterForm(forms.Form):
def __init__(self, *args, **kwargs):
super().__init__(*args, **kwargs)
from mainapp.models import Band, ObjectInfo
from mainapp.models import Band, ObjectInfo, Satellite, ObjItem
from django.db.models import Exists, OuterRef
# Фильтруем спутники: только те, у которых есть источники с точками
satellites_with_sources = Satellite.objects.filter(
parameters__objitem__source__isnull=False
).distinct().order_by('name')
self.fields['satellites'].queryset = satellites_with_sources
self.fields['band'].queryset = Band.objects.all().order_by('name')
self.fields['object_type'].queryset = ObjectInfo.objects.all().order_by('name')
@@ -768,3 +776,103 @@ class TransponderForm(forms.ModelForm):
cleaned_data['polarization'] = self.instance.polarization
return cleaned_data
class SatelliteForm(forms.ModelForm):
"""
Форма для создания и редактирования спутников.
"""
class Meta:
model = Satellite
fields = [
'name',
'norad',
'band',
'undersat_point',
'url',
'comment',
'launch_date',
]
widgets = {
'name': forms.TextInput(attrs={
'class': 'form-control',
'placeholder': 'Введите название спутника',
'required': True
}),
'norad': forms.NumberInput(attrs={
'class': 'form-control',
'placeholder': 'Введите NORAD ID'
}),
'band': forms.SelectMultiple(attrs={
'class': 'form-select',
'size': '5'
}),
'undersat_point': forms.NumberInput(attrs={
'class': 'form-control',
'step': '0.01',
'placeholder': 'Введите подспутниковую точку в градусах'
}),
'url': forms.URLInput(attrs={
'class': 'form-control',
'placeholder': 'https://example.com'
}),
'comment': forms.Textarea(attrs={
'class': 'form-control',
'rows': 3,
'placeholder': 'Введите комментарий'
}),
'launch_date': forms.DateInput(attrs={
'class': 'form-control',
'type': 'date'
}),
}
labels = {
'name': 'Название спутника',
'norad': 'NORAD ID',
'band': 'Диапазоны работы',
'undersat_point': 'Подспутниковая точка (градусы)',
'url': 'Ссылка на источник',
'comment': 'Комментарий',
'launch_date': 'Дата запуска',
}
help_texts = {
'name': 'Уникальное название спутника',
'norad': 'Идентификатор NORAD для отслеживания спутника',
'band': 'Выберите диапазоны работы спутника (удерживайте Ctrl для множественного выбора)',
'undersat_point': 'Восточное полушарие с +, западное с -',
'url': 'Ссылка на сайт, где можно проверить информацию',
'launch_date': 'Дата запуска спутника',
}
def __init__(self, *args, **kwargs):
super().__init__(*args, **kwargs)
from mainapp.models import Band
# Загружаем choices для select полей
self.fields['band'].queryset = Band.objects.all().order_by('name')
# Делаем name обязательным
self.fields['name'].required = True
def clean_name(self):
"""Валидация поля name."""
name = self.cleaned_data.get('name')
if name:
# Удаляем лишние пробелы
name = name.strip()
# Проверяем что после удаления пробелов что-то осталось
if not name:
raise forms.ValidationError('Название не может состоять только из пробелов')
# Проверяем уникальность (исключая текущий объект при редактировании)
qs = Satellite.objects.filter(name=name)
if self.instance and self.instance.pk:
qs = qs.exclude(pk=self.instance.pk)
if qs.exists():
raise forms.ValidationError('Спутник с таким названием уже существует')
return name