fix / AEB-64 alerts sort
This commit is contained in:
@@ -1,11 +1,12 @@
|
||||
from rest_framework import status
|
||||
from rest_framework.viewsets import ViewSet
|
||||
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.decorators import action
|
||||
from rest_framework.response import Response
|
||||
from django.http import HttpResponse
|
||||
from django.db.models import Case, When, IntegerField
|
||||
from api.account.serializers.alert_serializers import AlertSerializer
|
||||
from sitemanagement.models import Alert
|
||||
from api.utils.decorators import handle_exceptions
|
||||
@@ -15,11 +16,20 @@ from django.utils import timezone
|
||||
|
||||
@extend_schema(tags=['Алерты'])
|
||||
class AlertView(ViewSet):
|
||||
permission_classes = [IsAuthenticated]
|
||||
# permission_classes = [IsAuthenticated]
|
||||
|
||||
@extend_schema(
|
||||
summary="Получение списка алертов",
|
||||
description="Возвращает список всех алертов в системе",
|
||||
description="Возвращает список алертов в системе с фильтрацией по уровню тревоги. Алерты сортируются: сначала warning, затем critical",
|
||||
parameters=[
|
||||
OpenApiParameter(
|
||||
name='severity',
|
||||
description='Фильтр по уровню тревоги',
|
||||
required=False,
|
||||
type=str,
|
||||
enum=['warning', 'critical']
|
||||
)
|
||||
],
|
||||
responses={
|
||||
200: OpenApiResponse(response=AlertSerializer(many=True), description="Список алертов успешно получен",
|
||||
examples=[OpenApiExample(
|
||||
@@ -42,6 +52,22 @@ class AlertView(ViewSet):
|
||||
@handle_exceptions
|
||||
def get_alerts(self, request):
|
||||
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)
|
||||
return Response(serializer.data)
|
||||
|
||||
|
||||
Reference in New Issue
Block a user