old_console/incident_export/views.py
2024-11-02 14:12:45 +03:00

52 lines
2.4 KiB
Python

import logging
from django.utils.translation import gettext_lazy
from rest_framework.decorators import action
from rest_framework.response import Response
from rest_framework.viewsets import GenericViewSet, ModelViewSet
from core.mixins import ApiPermissionCheckMixin
from perms.models import Perm
from .models import Receiver, SyslogReceiver, OpcuaReceiver
from .serializers import SyslogReceiverSerializer, OpcuaReceiverSerializer, ChangeStateReceiverSerializer
_log = logging.getLogger(__name__)
class ChangeExportStatusActionMixin:
"""
A mixin that adds the ability (as an action) to bulk change the export state for selected receivers.
Separated into a mixin so that it can be added to multiple viewsets.
Since there are different viewsets for OPCUA receivers and SYSLOG receivers.
Gets a list of receivers IDs and changes their status to the one specified in the request body.
"""
@action(methods=['POST'], detail=False)
def change_state(self, request, *args, **kwargs):
serializer = ChangeStateReceiverSerializer(data=request.data)
serializer.is_valid(raise_exception=True)
ids_to_change = serializer.validated_data['ids']
new_export_status = serializer.validated_data['status']
receivers_to_change = self.queryset.filter(id__in=ids_to_change).values_list('receiver_id', flat=True)
Receiver.objects.filter(pk__in=receivers_to_change).update(export_status=new_export_status)
_log.info(f'Export status changed to {new_export_status} for following receivers: {receivers_to_change}')
return Response()
class SyslogReceiverViewSet(ApiPermissionCheckMixin,
ChangeExportStatusActionMixin,
ModelViewSet,
GenericViewSet):
console_permissions = [Perm.can_export_events]
message = gettext_lazy('Cannot access syslog Receivers. Permission denied')
serializer_class = SyslogReceiverSerializer
queryset = SyslogReceiver.objects.all()
class OpcuaReceiverViewSet(ApiPermissionCheckMixin,
ChangeExportStatusActionMixin,
ModelViewSet,
GenericViewSet):
console_permissions = [Perm.can_export_events]
message = gettext_lazy('Cannot access OPCUA Receivers. Permission denied')
serializer_class = OpcuaReceiverSerializer
queryset = OpcuaReceiver.objects.all()