Сделал вкладку спутников
This commit is contained in:
@@ -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
|
||||
|
||||
Reference in New Issue
Block a user