New api and zone management; highligh occlusion and highlighAll functionality; improved search in reports and alerts history + autofill; refactored alert panel

This commit is contained in:
iv_vuytsik
2025-12-25 03:10:21 +03:00
parent 31030f2997
commit ce7e39debf
36 changed files with 1562 additions and 472 deletions

View File

@@ -76,9 +76,9 @@ class ObjectAdmin(admin.ModelAdmin):
@admin.register(Zone)
class ZoneAdmin(admin.ModelAdmin):
list_display = ('object', 'floor', 'name')
list_filter = ('object', 'floor')
search_fields = ('object__title', 'name')
list_display = ('object', 'floor', 'order', 'name', 'image_path', 'model_path')
list_filter = ('object', 'floor', 'order')
search_fields = ('object__title', 'name', 'image_path', 'model_path')
list_per_page = 10
list_max_show_all = 100
list_display_links = ('object',)

View File

@@ -0,0 +1,32 @@
# Generated by Django 5.2.5 on 2025-12-22 17:41
from django.db import migrations, models
class Migration(migrations.Migration):
dependencies = [
('sitemanagement', '0007_alter_zone_options_zone_floor'),
]
operations = [
migrations.AlterModelOptions(
name='zone',
options={'ordering': ['object', 'floor', 'order', 'name'], 'verbose_name': 'Зона', 'verbose_name_plural': 'Зоны'},
),
migrations.AddField(
model_name='zone',
name='image_path',
field=models.CharField(blank=True, default='test_image.png', help_text="Например 'public/images/test_image.png' или имя файла из public/images", max_length=255, verbose_name='Путь к изображению'),
),
migrations.AddField(
model_name='zone',
name='model_path',
field=models.CharField(blank=True, help_text="Например 'frontend/assets/big-models/model.glb' или относительный путь к модели", max_length=255, null=True, verbose_name='Путь к 3D модели'),
),
migrations.AddField(
model_name='zone',
name='order',
field=models.PositiveSmallIntegerField(default=0, verbose_name='Порядок'),
),
]

View File

@@ -0,0 +1,18 @@
# Generated by Django 5.2.5 on 2025-12-22 17:47
from django.db import migrations, models
class Migration(migrations.Migration):
dependencies = [
('sitemanagement', '0008_alter_zone_options_zone_image_path_zone_model_path_and_more'),
]
operations = [
migrations.AlterField(
model_name='zone',
name='image_path',
field=models.CharField(blank=True, default='test_image.png', help_text="Например 'public/images/test_image.png' или имя файла из public/images", max_length=255, verbose_name='Путь к изображению'),
),
]

View File

@@ -0,0 +1,23 @@
# Generated by Django 5.2.5 on 2025-12-24 19:32
from django.db import migrations, models
class Migration(migrations.Migration):
dependencies = [
('sitemanagement', '0009_alter_zone_image_path'),
]
operations = [
migrations.AlterField(
model_name='zone',
name='image_path',
field=models.CharField(blank=True, default='test_image.png', help_text="Например 'test_image_2.png'", max_length=255, verbose_name='Путь к изображению'),
),
migrations.AlterField(
model_name='zone',
name='model_path',
field=models.CharField(blank=True, help_text="Например '/static-models/AerBIM-Monitor_ASM-HTViewer_Expo2017Astana_20250908_L_+76190.glb'", max_length=255, null=True, verbose_name='Путь к 3D модели'),
),
]

View File

@@ -175,6 +175,9 @@ class Zone(models.Model):
object = models.ForeignKey(Object, on_delete=models.CASCADE, related_name="zones", verbose_name="Объект")
name = models.CharField(max_length=255, verbose_name="Название")
floor = models.PositiveSmallIntegerField(verbose_name="Этаж")
image_path = models.CharField(max_length=255, verbose_name="Путь к изображению", blank=True, default="test_image.png", help_text="Например 'test_image_2.png'")
model_path = models.CharField(max_length=255, verbose_name="Путь к 3D модели", blank=True, null=True, help_text="Например '/static-models/AerBIM-Monitor_ASM-HTViewer_Expo2017Astana_20250908_L_+76190.glb'")
order = models.PositiveSmallIntegerField(default=0, verbose_name="Порядок")
sensors = models.ManyToManyField(Sensor, related_name="zones", verbose_name="Датчики")
created_at = models.DateTimeField(auto_now_add=True)
updated_at = models.DateTimeField(auto_now=True)
@@ -182,7 +185,7 @@ class Zone(models.Model):
class Meta:
verbose_name = "Зона"
verbose_name_plural = "Зоны"
ordering = ["object", "floor", "name"] # сортировка сначала по объекту, потом по этажу
ordering = ["object", "floor", "order", "name"] # сортировка по объекту, этажу, порядку, названию
def clean(self):
from django.core.exceptions import ValidationError