feat / AEB-64 create alert routes
This commit is contained in:
81
backend/api/account/views/alert_views.py
Normal file
81
backend/api/account/views/alert_views.py
Normal file
@@ -0,0 +1,81 @@
|
||||
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)
|
||||
|
||||
Reference in New Issue
Block a user