Files
aerbim-ht-monitor/backend/api/account/views/alert_views.py
2025-10-07 12:42:01 +03:00

82 lines
3.8 KiB
Python

from rest_framework import status, serializers
from rest_framework.viewsets import ViewSet
from rest_framework.permissions import IsAuthenticated
from drf_spectacular.utils import extend_schema, OpenApiResponse, OpenApiExample
from rest_framework.decorators import action
from rest_framework.response import Response
from api.account.serializers.alert_serializers import AlertSerializer
from sitemanagement.models import Alert
from api.utils.decorators import handle_exceptions
from api.utils.error_serializer import ErrorResponseSerializer
@extend_schema(tags=['Алерты'])
class AlertView(ViewSet):
permission_classes = [IsAuthenticated]
@extend_schema(
summary="Получение списка алертов",
description="Возвращает список всех алертов в системе",
responses={
200: OpenApiResponse(response=AlertSerializer(many=True), description="Список алертов успешно получен",
examples=[OpenApiExample(
'Успешный ответ',
value=[{
"id": 1,
"name": "Датчик 1",
"object": "Объект 1",
"metric_value": "12.5 °C",
"sensor_type_name": "Инклинометр",
"message": "alert message",
"severity": "warning",
"created_at": "2025-10-06T15:53:11.759725+03:00",
"resolved": False
}]
)])
})
@action(detail=False, methods=['get'])
@handle_exceptions
def get_alerts(self, request):
alerts = Alert.objects.all()
serializer = AlertSerializer(alerts, many=True)
return Response(serializer.data)
@extend_schema(
summary="Изменение статуса алерта",
description="Изменяет статус обработки алерта на противоположный",
responses={
200: OpenApiResponse(response=AlertSerializer, description="Статус алерта успешно изменен",
examples=[OpenApiExample(
'Успешный ответ',
value={
"message": "Статус алерта успешно изменен"
}
)]),
404: OpenApiResponse(
response=ErrorResponseSerializer,
description="Алерт не найден",
examples=[
OpenApiExample(
'Алерт не найден',
value={"error": "Алерт не найден"},
status_codes=['404']
)
]
)
})
@action(detail=True, methods=['patch'])
@handle_exceptions
def change_alert_status(self, request, pk=None):
try:
alert = Alert.objects.get(pk=pk)
alert.resolved = not alert.resolved
alert.save()
return Response({"message": "Статус алерта успешно изменен"}, status=status.HTTP_200_OK)
except Alert.DoesNotExist:
return Response(
{"error": "Алерт не найден"},
status=status.HTTP_404_NOT_FOUND)