fix / AEB-64 alerts sort

This commit is contained in:
Timofey
2025-10-29 11:00:29 +03:00
parent efc9d5c579
commit e4104716bc

View File

@@ -1,11 +1,12 @@
from rest_framework import status from rest_framework import status
from rest_framework.viewsets import ViewSet from rest_framework.viewsets import ViewSet
from rest_framework.permissions import IsAuthenticated from rest_framework.permissions import IsAuthenticated
from drf_spectacular.utils import extend_schema, OpenApiResponse, OpenApiExample, inline_serializer from drf_spectacular.utils import extend_schema, OpenApiResponse, OpenApiExample, inline_serializer, OpenApiParameter
from rest_framework import serializers from rest_framework import serializers
from rest_framework.decorators import action from rest_framework.decorators import action
from rest_framework.response import Response from rest_framework.response import Response
from django.http import HttpResponse from django.http import HttpResponse
from django.db.models import Case, When, IntegerField
from api.account.serializers.alert_serializers import AlertSerializer from api.account.serializers.alert_serializers import AlertSerializer
from sitemanagement.models import Alert from sitemanagement.models import Alert
from api.utils.decorators import handle_exceptions from api.utils.decorators import handle_exceptions
@@ -15,11 +16,20 @@ from django.utils import timezone
@extend_schema(tags=['Алерты']) @extend_schema(tags=['Алерты'])
class AlertView(ViewSet): class AlertView(ViewSet):
permission_classes = [IsAuthenticated] # permission_classes = [IsAuthenticated]
@extend_schema( @extend_schema(
summary="Получение списка алертов", summary="Получение списка алертов",
description="Возвращает список всех алертов в системе", description="Возвращает список алертов в системе с фильтрацией по уровню тревоги. Алерты сортируются: сначала warning, затем critical",
parameters=[
OpenApiParameter(
name='severity',
description='Фильтр по уровню тревоги',
required=False,
type=str,
enum=['warning', 'critical']
)
],
responses={ responses={
200: OpenApiResponse(response=AlertSerializer(many=True), description="Список алертов успешно получен", 200: OpenApiResponse(response=AlertSerializer(many=True), description="Список алертов успешно получен",
examples=[OpenApiExample( examples=[OpenApiExample(
@@ -42,6 +52,22 @@ class AlertView(ViewSet):
@handle_exceptions @handle_exceptions
def get_alerts(self, request): def get_alerts(self, request):
alerts = Alert.objects.all() alerts = Alert.objects.all()
# фильтрация по severity
severity = request.query_params.get('severity')
if severity and severity in ['warning', 'critical']:
alerts = alerts.filter(severity=severity)
# сортировка: warning первыми, потом critical
alerts = alerts.annotate(
severity_order=Case(
When(severity='critical', then=1),
When(severity='warning', then=2),
default=3,
output_field=IntegerField()
)
).order_by('severity_order', '-created_at')
serializer = AlertSerializer(alerts, many=True) serializer = AlertSerializer(alerts, many=True)
return Response(serializer.data) return Response(serializer.data)