diff --git a/dbapp/lyngsatapp/templates/lyngsatapp/lyngsat_list.html b/dbapp/lyngsatapp/templates/lyngsatapp/lyngsat_list.html index c708559..b021075 100644 --- a/dbapp/lyngsatapp/templates/lyngsatapp/lyngsat_list.html +++ b/dbapp/lyngsatapp/templates/lyngsatapp/lyngsat_list.html @@ -20,7 +20,7 @@
-

Источники LyngSat

+

Данные по ИРИ с ресурса LyngSat

diff --git a/dbapp/mainapp/forms.py b/dbapp/mainapp/forms.py index de3c51e..65217f6 100644 --- a/dbapp/mainapp/forms.py +++ b/dbapp/mainapp/forms.py @@ -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 diff --git a/dbapp/mainapp/templates/mainapp/components/_navbar.html b/dbapp/mainapp/templates/mainapp/components/_navbar.html index 7d1675c..50aed1a 100644 --- a/dbapp/mainapp/templates/mainapp/components/_navbar.html +++ b/dbapp/mainapp/templates/mainapp/components/_navbar.html @@ -26,7 +26,10 @@ Транспондеры +