Поправил админку для новой модели

This commit is contained in:
2025-11-12 22:03:00 +03:00
parent 7126974aed
commit a7e8f81ef3
2 changed files with 75 additions and 12 deletions

View File

@@ -854,6 +854,67 @@ class BandAdmin(ImportExportActionModelAdmin, BaseAdmin):
ordering = ("name",) ordering = ("name",)
class ObjItemInline(admin.TabularInline):
"""Inline для отображения объектов ObjItem в Source."""
model = ObjItem
fk_name = "source"
extra = 0
can_delete = False
verbose_name = "Объект"
verbose_name_plural = "Объекты"
fields = ("name", "get_geo_coords", "get_satellite", "get_frequency", "get_polarization", "updated_at")
readonly_fields = ("name", "get_geo_coords", "get_satellite", "get_frequency", "get_polarization", "updated_at")
def get_queryset(self, request):
"""Оптимизированный queryset с предзагрузкой связанных объектов."""
qs = super().get_queryset(request)
return qs.select_related(
'geo_obj',
'parameter_obj',
'parameter_obj__id_satellite',
'parameter_obj__polarization'
)
def get_geo_coords(self, obj):
"""Отображает координаты из связанной модели Geo."""
if not obj or not hasattr(obj, 'geo_obj'):
return "-"
geo = obj.geo_obj
if not geo or not geo.coords:
return "-"
longitude = geo.coords.coords[0]
latitude = geo.coords.coords[1]
lon = f"{longitude}E" if longitude > 0 else f"{abs(longitude)}W"
lat = f"{latitude}N" if latitude > 0 else f"{abs(latitude)}S"
return f"{lat} {lon}"
get_geo_coords.short_description = "Координаты"
def get_satellite(self, obj):
"""Отображает спутник из связанного параметра."""
if hasattr(obj, 'parameter_obj') and obj.parameter_obj and obj.parameter_obj.id_satellite:
return obj.parameter_obj.id_satellite.name
return "-"
get_satellite.short_description = "Спутник"
def get_frequency(self, obj):
"""Отображает частоту из связанного параметра."""
if hasattr(obj, 'parameter_obj') and obj.parameter_obj:
return obj.parameter_obj.frequency
return "-"
get_frequency.short_description = "Частота, МГц"
def get_polarization(self, obj):
"""Отображает поляризацию из связанного параметра."""
if hasattr(obj, 'parameter_obj') and obj.parameter_obj and obj.parameter_obj.polarization:
return obj.parameter_obj.polarization.name
return "-"
get_polarization.short_description = "Поляризация"
def has_add_permission(self, request, obj=None):
return False
@admin.register(Source) @admin.register(Source)
class SourceAdmin(ImportExportActionModelAdmin, LeafletGeoAdmin, BaseAdmin): class SourceAdmin(ImportExportActionModelAdmin, LeafletGeoAdmin, BaseAdmin):
"""Админ-панель для модели Source.""" """Админ-панель для модели Source."""
@@ -864,6 +925,7 @@ class SourceAdmin(ImportExportActionModelAdmin, LeafletGeoAdmin, BaseAdmin):
) )
ordering = ("-created_at",) ordering = ("-created_at",)
readonly_fields = ("created_at", "created_by", "updated_at", "updated_by") readonly_fields = ("created_at", "created_by", "updated_at", "updated_by")
inlines = [ObjItemInline]
fieldsets = ( fieldsets = (
("Координаты: геолокация", { ("Координаты: геолокация", {

View File

@@ -201,6 +201,7 @@ class Standard(models.Model):
verbose_name_plural = "Стандарты" verbose_name_plural = "Стандарты"
ordering = ["name"] ordering = ["name"]
class Band(models.Model): class Band(models.Model):
name = models.CharField( name = models.CharField(
max_length=50, max_length=50,
@@ -209,14 +210,10 @@ class Band(models.Model):
help_text="Название диапазона", help_text="Название диапазона",
) )
border_start = models.FloatField( border_start = models.FloatField(
blank=True, blank=True, null=True, verbose_name="Нижняя граница диапазона, МГц"
null=True,
verbose_name="Нижняя граница диапазона, МГц"
) )
border_end = models.FloatField( border_end = models.FloatField(
blank=True, blank=True, null=True, verbose_name="Верхняя граница диапазона, МГц"
null=True,
verbose_name="Верхняя граница диапазона, МГц"
) )
def __str__(self): def __str__(self):
@@ -319,8 +316,6 @@ class Satellite(models.Model):
ordering = ["name"] ordering = ["name"]
class ObjItemQuerySet(models.QuerySet): class ObjItemQuerySet(models.QuerySet):
"""Custom QuerySet для модели ObjItem с оптимизированными запросами""" """Custom QuerySet для модели ObjItem с оптимизированными запросами"""
@@ -374,6 +369,13 @@ class Source(models.Model):
Модель источника сигнала. Модель источника сигнала.
""" """
coords_average = gis.PointField(
srid=4326,
null=True,
blank=True,
verbose_name="Координаты ГЛ",
help_text="Усреднённые координаты, полученные от в ходе геолокации (WGS84)",
)
coords_kupsat = gis.PointField( coords_kupsat = gis.PointField(
srid=4326, srid=4326,
null=True, null=True,
@@ -425,7 +427,6 @@ class Source(models.Model):
help_text="Пользователь, последним изменивший запись", help_text="Пользователь, последним изменивший запись",
) )
class Meta: class Meta:
verbose_name = "Источник" verbose_name = "Источник"
verbose_name_plural = "Источники" verbose_name_plural = "Источники"
@@ -452,12 +453,12 @@ class ObjItem(models.Model):
on_delete=models.CASCADE, on_delete=models.CASCADE,
null=True, null=True,
verbose_name="ИРИ", verbose_name="ИРИ",
related_name="source", related_name="source_objitems",
) )
transponder = models.ForeignKey( transponder = models.ForeignKey(
"mapsapp.Transponders", "mapsapp.Transponders",
on_delete=models.SET_NULL, on_delete=models.SET_NULL,
related_name="transponder", related_name="transponder_objitems",
null=True, null=True,
blank=True, blank=True,
verbose_name="Транспондер", verbose_name="Транспондер",
@@ -596,7 +597,7 @@ class Parameter(models.Model):
verbose_name="Объект", verbose_name="Объект",
null=True, null=True,
blank=True, blank=True,
help_text="Связанный объект" help_text="Связанный объект",
) )
# id_sigma_parameter = models.ManyToManyField(SigmaParameter, on_delete=models.SET_NULL, related_name="sigma_parameter", verbose_name="ВЧ с sigma", null=True, blank=True) # id_sigma_parameter = models.ManyToManyField(SigmaParameter, on_delete=models.SET_NULL, related_name="sigma_parameter", verbose_name="ВЧ с sigma", null=True, blank=True)
# id_sigma_parameter = models.ManyToManyField(SigmaParameter, verbose_name="ВЧ с sigma", null=True, blank=True) # id_sigma_parameter = models.ManyToManyField(SigmaParameter, verbose_name="ВЧ с sigma", null=True, blank=True)