""" Модели технического анализа (TechAnalyze, ObjectMark). """ from django.db import models from django.utils import timezone from .defaults import ( get_default_polarization, get_default_modulation, get_default_standard, ) class TechAnalyze(models.Model): """ Модель технического анализа сигнала. Хранит информацию о технических параметрах сигнала для анализа. """ # Основные поля name = models.CharField( max_length=255, unique=True, verbose_name="Имя", db_index=True, help_text="Уникальное название для технического анализа", ) satellite = models.ForeignKey( 'mainapp.Satellite', on_delete=models.PROTECT, related_name="tech_analyzes", verbose_name="Спутник", help_text="Спутник, к которому относится анализ", ) polarization = models.ForeignKey( 'mainapp.Polarization', default=get_default_polarization, on_delete=models.SET_DEFAULT, related_name="tech_analyze_polarizations", null=True, blank=True, verbose_name="Поляризация", ) frequency = models.FloatField( default=0, null=True, blank=True, verbose_name="Частота, МГц", db_index=True, help_text="Центральная частота сигнала", ) freq_range = models.FloatField( default=0, null=True, blank=True, verbose_name="Полоса частот, МГц", help_text="Полоса частот сигнала", ) bod_velocity = models.FloatField( default=0, null=True, blank=True, verbose_name="Символьная скорость, БОД", help_text="Символьная скорость", ) modulation = models.ForeignKey( 'mainapp.Modulation', default=get_default_modulation, on_delete=models.SET_DEFAULT, related_name="tech_analyze_modulations", null=True, blank=True, verbose_name="Модуляция", ) standard = models.ForeignKey( 'mainapp.Standard', default=get_default_standard, on_delete=models.SET_DEFAULT, related_name="tech_analyze_standards", null=True, blank=True, verbose_name="Стандарт", ) note = models.TextField( null=True, blank=True, verbose_name="Примечание", help_text="Дополнительные примечания", ) # Метаданные created_at = models.DateTimeField( auto_now_add=True, verbose_name="Дата создания", help_text="Дата и время создания записи", ) created_by = models.ForeignKey( 'mainapp.CustomUser', on_delete=models.SET_NULL, related_name="tech_analyze_created", null=True, blank=True, verbose_name="Создан пользователем", help_text="Пользователь, создавший запись", ) updated_at = models.DateTimeField( auto_now=True, verbose_name="Дата последнего изменения", help_text="Дата и время последнего изменения", ) updated_by = models.ForeignKey( 'mainapp.CustomUser', on_delete=models.SET_NULL, related_name="tech_analyze_updated", null=True, blank=True, verbose_name="Изменен пользователем", help_text="Пользователь, последним изменивший запись", ) def __str__(self): return f"{self.name} ({self.satellite.name if self.satellite else '-'})" class Meta: verbose_name = "Тех. анализ" verbose_name_plural = "Тех. анализы" ordering = ["-created_at"] class ObjectMark(models.Model): """ Модель отметки о наличии сигнала. Используется для фиксации моментов времени когда сигнал был обнаружен или отсутствовал. Привязывается к записям технического анализа (TechAnalyze). """ # Основные поля mark = models.BooleanField( null=True, blank=True, verbose_name="Наличие сигнала", help_text="True - сигнал обнаружен, False - сигнал отсутствует", ) timestamp = models.DateTimeField( verbose_name="Время", db_index=True, help_text="Время фиксации отметки", null=True, blank=True, ) tech_analyze = models.ForeignKey( TechAnalyze, on_delete=models.CASCADE, related_name="marks", verbose_name="Тех. анализ", help_text="Связанный технический анализ", ) created_by = models.ForeignKey( 'mainapp.CustomUser', on_delete=models.SET_NULL, related_name="marks_created", null=True, blank=True, verbose_name="Создан пользователем", help_text="Пользователь, создавший отметку", ) def can_edit(self): """Проверка возможности редактирования отметки (в течение 5 минут)""" from datetime import timedelta if not self.timestamp: return False time_diff = timezone.now() - self.timestamp return time_diff < timedelta(minutes=5) def can_add_new_mark_for_object(self): """Проверка возможности добавления новой отметки для объекта (прошло 5 минут с последней)""" from datetime import timedelta if not self.timestamp: return True time_diff = timezone.now() - self.timestamp return time_diff >= timedelta(minutes=5) def __str__(self): if self.timestamp: timestamp = self.timestamp.strftime("%d.%m.%Y %H:%M") tech_name = self.tech_analyze.name if self.tech_analyze else "?" mark_str = "+" if self.mark else "-" return f"{tech_name}: {mark_str} {timestamp}" return "Отметка без времени" class Meta: verbose_name = "Отметка сигнала" verbose_name_plural = "Отметки сигналов" ordering = ["-timestamp"] indexes = [ models.Index(fields=["tech_analyze", "-timestamp"]), ]