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)