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

58 lines
2.4 KiB
Python

import logging
from django.db import transaction
from django.utils.translation import gettext_lazy
from rest_framework.exceptions import ValidationError
from rest_framework.generics import get_object_or_404
from rest_framework import serializers
from inputs.enums import LogInputType
from inputs.models import LogInput, LogInputArmaIF, LogInputEndpoint
from inputs.services.inputs import create_input, update_input
from inputs.services.update_config import update_arma_config, update_endpoint_config
_log = logging.getLogger(__name__)
class InputSerializer(serializers.ModelSerializer):
port = serializers.IntegerField(min_value=1500, max_value=65535, write_only=True)
class Meta:
model = LogInput
fields = ['id', 'label', 'type', 'can_delete', 'port']
def validate_port(self, value):
input_kwargs = {}
if self.instance:
loginput_id = self.instance.pk
input_kwargs = {'input': loginput_id}
if LogInputArmaIF.objects.filter(port=value).exclude(**input_kwargs).exists() or \
LogInputEndpoint.objects.filter(port=value).exclude(**input_kwargs).exists():
raise ValidationError(gettext_lazy('This port is already in use'))
return value
def create(self, validated_data):
with transaction.atomic():
port = validated_data.pop('port')
input_instance = super().create(validated_data)
create_input(input_instance, port)
_log.info(
f'User [{self.context["request"].user}] create logstash config [{input_instance.config_file_name}]')
return input_instance
def update(self, instance, validated_data):
with transaction.atomic():
port = validated_data.pop('port', None)
input_instance = super().update(instance, validated_data)
update_input(input_instance, port)
_log.info(
f'User [{self.context["request"].user}] update logstash config [{input_instance.config_file_name}]')
return input_instance
def to_representation(self, instance: LogInput):
log_input_data = super().to_representation(instance)
if instance.type == LogInputType.ARMAIF:
log_input_data['port'] = instance.loginputarmaif.port
elif instance.type == LogInputType.ENDPOINT:
log_input_data['port'] = instance.loginputendpoint.port
return log_input_data