diff --git a/dbapp/mainapp/admin.py b/dbapp/mainapp/admin.py index c133216..2f2e89e 100644 --- a/dbapp/mainapp/admin.py +++ b/dbapp/mainapp/admin.py @@ -26,6 +26,7 @@ from .models import ( SigmaParMark, ObjectMark, ObjectInfo, + ObjectOwnership, SigmaParameter, Parameter, Satellite, @@ -404,6 +405,15 @@ class ObjectInfoAdmin(BaseAdmin): ordering = ("name",) +@admin.register(ObjectOwnership) +class ObjectOwnershipAdmin(BaseAdmin): + """Админ-панель для модели ObjectOwnership (Принадлежность объекта).""" + + list_display = ("name",) + search_fields = ("name",) + ordering = ("name",) + + class SigmaParameterInline(admin.StackedInline): model = SigmaParameter extra = 0 diff --git a/dbapp/mainapp/forms.py b/dbapp/mainapp/forms.py index 65217f6..8e4e4ca 100644 --- a/dbapp/mainapp/forms.py +++ b/dbapp/mainapp/forms.py @@ -463,15 +463,20 @@ class SourceForm(forms.ModelForm): class Meta: model = Source - fields = ['info'] + fields = ['info', 'ownership'] widgets = { 'info': forms.Select(attrs={ 'class': 'form-select', 'id': 'id_info', }), + 'ownership': forms.Select(attrs={ + 'class': 'form-select', + 'id': 'id_ownership', + }), } labels = { 'info': 'Тип объекта', + 'ownership': 'Принадлежность объекта', } def __init__(self, *args, **kwargs): @@ -607,9 +612,8 @@ class KubsatFilterForm(forms.Form): widget=forms.SelectMultiple(attrs={'class': 'form-select', 'size': '3'}) ) - # Заглушка для принадлежности объекта - object_ownership = forms.MultipleChoiceField( - choices=[], + object_ownership = forms.ModelMultipleChoiceField( + queryset=None, label='Принадлежность объекта', required=False, widget=forms.SelectMultiple(attrs={'class': 'form-select', 'size': '3'}) @@ -658,7 +662,7 @@ class KubsatFilterForm(forms.Form): def __init__(self, *args, **kwargs): super().__init__(*args, **kwargs) - from mainapp.models import Band, ObjectInfo, Satellite, ObjItem + from mainapp.models import Band, ObjectInfo, ObjectOwnership, Satellite, ObjItem from django.db.models import Exists, OuterRef # Фильтруем спутники: только те, у которых есть источники с точками @@ -669,6 +673,7 @@ class KubsatFilterForm(forms.Form): 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') + self.fields['object_ownership'].queryset = ObjectOwnership.objects.all().order_by('name') class TransponderForm(forms.ModelForm): diff --git a/dbapp/mainapp/migrations/0009_objectownership_alter_source_info_source_ownership.py b/dbapp/mainapp/migrations/0009_objectownership_alter_source_info_source_ownership.py new file mode 100644 index 0000000..0c453ea --- /dev/null +++ b/dbapp/mainapp/migrations/0009_objectownership_alter_source_info_source_ownership.py @@ -0,0 +1,36 @@ +# Generated by Django 5.2.7 on 2025-11-20 11:45 + +import django.db.models.deletion +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ('mainapp', '0008_objectinfo_source_info'), + ] + + operations = [ + migrations.CreateModel( + name='ObjectOwnership', + fields=[ + ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), + ('name', models.CharField(help_text='Принадлежность объекта (страна, организация и т.д.)', max_length=255, unique=True, verbose_name='Принадлежность')), + ], + options={ + 'verbose_name': 'Принадлежность объекта', + 'verbose_name_plural': 'Принадлежности объектов', + 'ordering': ['name'], + }, + ), + migrations.AlterField( + model_name='source', + name='info', + field=models.ForeignKey(blank=True, help_text='Тип объекта', null=True, on_delete=django.db.models.deletion.SET_NULL, related_name='source_info', to='mainapp.objectinfo', verbose_name='Тип объекта'), + ), + migrations.AddField( + model_name='source', + name='ownership', + field=models.ForeignKey(blank=True, help_text='Принадлежность объекта (страна, организация и т.д.)', null=True, on_delete=django.db.models.deletion.SET_NULL, related_name='source_ownership', to='mainapp.objectownership', verbose_name='Принадлежность объекта'), + ), + ] diff --git a/dbapp/mainapp/models.py b/dbapp/mainapp/models.py index fc71c23..80cf387 100644 --- a/dbapp/mainapp/models.py +++ b/dbapp/mainapp/models.py @@ -84,6 +84,28 @@ class ObjectInfo(models.Model): ordering = ["name"] +class ObjectOwnership(models.Model): + """ + Модель принадлежности объекта. + + Определяет к какой организации/стране/группе принадлежит объект. + """ + name = models.CharField( + max_length=255, + unique=True, + verbose_name="Принадлежность", + help_text="Принадлежность объекта (страна, организация и т.д.)", + ) + + def __str__(self): + return self.name + + class Meta: + verbose_name = "Принадлежность объекта" + verbose_name_plural = "Принадлежности объектов" + ordering = ["name"] + + class ObjectMark(models.Model): """ Модель отметки о наличии объекта. @@ -457,7 +479,17 @@ class Source(models.Model): related_name="source_info", null=True, blank=True, - verbose_name="Тип объекта" + verbose_name="Тип объекта", + help_text="Тип объекта", + ) + ownership = models.ForeignKey( + 'ObjectOwnership', + on_delete=models.SET_NULL, + related_name="source_ownership", + null=True, + blank=True, + verbose_name="Принадлежность объекта", + help_text="Принадлежность объекта (страна, организация и т.д.)", ) coords_average = gis.PointField( diff --git a/dbapp/mainapp/templates/mainapp/components/_navbar.html b/dbapp/mainapp/templates/mainapp/components/_navbar.html index 50aed1a..c9156cb 100644 --- a/dbapp/mainapp/templates/mainapp/components/_navbar.html +++ b/dbapp/mainapp/templates/mainapp/components/_navbar.html @@ -23,10 +23,10 @@ Точки