feat / AEB-65 generate reports
This commit is contained in:
@@ -2,7 +2,7 @@ from django.urls import path
|
||||
from .views.UserDataView import UserDataView
|
||||
from .views.objects_views import ObjectView
|
||||
from .views.sensors_views import SensorView
|
||||
from .views.alert_views import AlertView
|
||||
from .views.alert_views import AlertView, ReportView
|
||||
from drf_spectacular.views import (
|
||||
SpectacularAPIView,
|
||||
SpectacularSwaggerView,
|
||||
@@ -31,4 +31,6 @@ urlpatterns = [
|
||||
|
||||
path("get-alerts/", AlertView.as_view({'get': 'get_alerts'}), name="alerts"),
|
||||
path("update-alert/<int:pk>/", AlertView.as_view({'patch': 'change_alert_status'}), name="update-alert"),
|
||||
|
||||
path("get-reports/", ReportView.as_view({'post': 'get_reports'}), name="reports"),
|
||||
]
|
||||
|
||||
@@ -1,13 +1,16 @@
|
||||
from rest_framework import status, serializers
|
||||
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
|
||||
from rest_framework.decorators import action
|
||||
from rest_framework.response import Response
|
||||
from django.http import HttpResponse
|
||||
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
|
||||
from api.utils.report_generators import generate_csv_report, generate_pdf_report
|
||||
from django.utils import timezone
|
||||
|
||||
@extend_schema(tags=['Алерты'])
|
||||
class AlertView(ViewSet):
|
||||
@@ -79,3 +82,68 @@ class AlertView(ViewSet):
|
||||
{"error": "Алерт не найден"},
|
||||
status=status.HTTP_404_NOT_FOUND)
|
||||
|
||||
@extend_schema(tags=['Репорты'])
|
||||
class ReportView(ViewSet):
|
||||
# permission_classes = [IsAuthenticated]
|
||||
|
||||
@extend_schema(
|
||||
summary="Генерация отчета",
|
||||
description="Генерирует отчет в выбранном формате (PDF или CSV)",
|
||||
request={'application/json': {'type': 'object', 'properties': {'report_format': {'type': 'string', 'enum': ['pdf', 'csv']}}}},
|
||||
responses={
|
||||
200: OpenApiResponse(response=AlertSerializer(many=True), description="Список репортов успешно получен",
|
||||
examples=[OpenApiExample(
|
||||
'Успешный ответ',
|
||||
value=[{
|
||||
"message" : "Отчет успешно сгенерирован"
|
||||
}]
|
||||
)]),
|
||||
400: OpenApiResponse(
|
||||
response=ErrorResponseSerializer,
|
||||
description="Неверный формат",
|
||||
examples=[OpenApiExample(
|
||||
'Неверный формат',
|
||||
value={"error": "Неверный формат"},
|
||||
status_codes=['400']
|
||||
)]
|
||||
)
|
||||
})
|
||||
@action(detail=False, methods=['post'])
|
||||
@handle_exceptions
|
||||
def get_reports(self, request):
|
||||
"""Генерация отчета в выбранном формате"""
|
||||
report_format = request.data.get('report_format', '').lower()
|
||||
|
||||
if not report_format:
|
||||
report_format = request.query_params.get('format', '').lower()
|
||||
|
||||
if report_format not in ["pdf", "csv"]:
|
||||
return Response(
|
||||
{"error": "Неверный формат. Допустимые значения: pdf, csv"},
|
||||
status=status.HTTP_400_BAD_REQUEST
|
||||
)
|
||||
|
||||
alerts = Alert.objects.select_related(
|
||||
'sensor',
|
||||
'sensor__signal_format',
|
||||
'sensor_type',
|
||||
'metric'
|
||||
).prefetch_related(
|
||||
'sensor__zones',
|
||||
'sensor__zones__object'
|
||||
).all()
|
||||
|
||||
# текущая дата для имени файла
|
||||
timestamp = timezone.now().strftime("%Y%m%d_%H%M%S")
|
||||
|
||||
if report_format == "csv":
|
||||
response = HttpResponse(content_type='text/csv')
|
||||
response['Content-Disposition'] = f'attachment; filename="alerts_report_{timestamp}.csv"'
|
||||
response.write(generate_csv_report(alerts))
|
||||
return response
|
||||
|
||||
else: # pdf
|
||||
response = HttpResponse(content_type='application/pdf')
|
||||
response['Content-Disposition'] = f'attachment; filename="alerts_report_{timestamp}.pdf"'
|
||||
response.write(generate_pdf_report(alerts))
|
||||
return response
|
||||
Reference in New Issue
Block a user