old_console/inputs/models.py
2024-11-02 14:12:45 +03:00

96 lines
3.9 KiB
Python

import logging
from django.db.models.signals import pre_delete
from django.dispatch import receiver
from django.utils.translation import gettext_lazy
from django.db import models
from core.fields import IntegerField
from devices.models.endpoint_device import EndpointModel
from inputs.enums import LogInputType, AdjustDatetime
from devices.models.sensor import ArmaSensor
_log = logging.getLogger(__name__)
class LogInput(models.Model):
label = models.CharField(max_length=128,
verbose_name=gettext_lazy("Name"),
help_text=gettext_lazy('Name of the input'), unique=True)
type = models.CharField(max_length=128,
choices=LogInputType.choices,
verbose_name=gettext_lazy("Type"),
help_text=gettext_lazy("Type of loginput"))
can_delete = models.BooleanField(verbose_name=gettext_lazy('Can delete'),
help_text=gettext_lazy('Can user delete this input'),
default=False)
config_file_name = models.CharField(max_length=1024,
null=True,
blank=True,
verbose_name=gettext_lazy('Config file name'),
help_text=gettext_lazy('File name of generated config'))
adjust_datetime = IntegerField(choices=AdjustDatetime.choices, default=AdjustDatetime.LOCAL,
verbose_name=gettext_lazy("Adjust datetime"))
class SensorGetterMixin:
def get_sensor(self):
raise NotImplementedError()
class LogInputArmaIF(SensorGetterMixin, models.Model):
input = models.OneToOneField(LogInput,
on_delete=models.CASCADE,
primary_key=True)
port = IntegerField(min_value=1500,
max_value=65535,
verbose_name=gettext_lazy('Port'),
help_text=gettext_lazy("Input port number (UDP)"),
unique=True,
error_messages={
'unique': gettext_lazy('This port is already in use')
})
sensor = models.OneToOneField(ArmaSensor, on_delete=models.SET_NULL,
null=True, blank=True)
def get_sensor(self):
return self.sensor
class LogInputEndpoint(SensorGetterMixin, models.Model):
input = models.OneToOneField(LogInput, on_delete=models.CASCADE, primary_key=True)
port = IntegerField(min_value=1500,
max_value=65535,
verbose_name=gettext_lazy('Port'),
help_text=gettext_lazy("Input port number (UDP)"),
unique=True,
error_messages={
'unique': gettext_lazy('This port is already in use')
})
endpoint = models.OneToOneField(EndpointModel, on_delete=models.SET_NULL, null=True, blank=True)
def get_sensor(self):
return self.endpoint
@receiver(pre_delete, sender=EndpointModel)
def pre_delete_endpoint_log_input(sender, **kwargs):
endpoint = kwargs['instance']
_log.info(f"Removing log input for [{endpoint.name}]")
endpointInputList = list(LogInputEndpoint.objects.filter(endpoint=endpoint))
for item in endpointInputList:
item.input.delete()
item.delete()
@receiver(pre_delete, sender=ArmaSensor)
def pre_delete_arma_log_input(sender, **kwargs):
sensor = kwargs['instance']
_log.info(f"Removing log input for [{sensor.name}]")
armaInputList = list(LogInputArmaIF.objects.filter(sensor=sensor))
for item in armaInputList:
item.input.delete()
item.delete()