Coverage for backend/core/auxiliary/views/DownloadMSSData.py: 43%
54 statements
« prev ^ index » next coverage.py v7.10.7, created at 2025-11-06 23:27 +0000
« prev ^ index » next coverage.py v7.10.7, created at 2025-11-06 23:27 +0000
1from core.auxiliary.models.Expression import Expression
2from core.auxiliary.serializers.ExpressionSerializer import ExpressionSerializer
3from drf_spectacular.utils import OpenApiParameter, OpenApiTypes, extend_schema
4from rest_framework.decorators import api_view, renderer_classes
5from rest_framework.response import Response
6from rest_framework_csv.renderers import CSVRenderer
7from rest_framework import serializers
8import csv
9from django.http import HttpResponse
10from core.validation import api_view_validate
11from core.auxiliary.methods.export_scenario_data import export_scenario_data, collate
12from core.auxiliary.models.Scenario import Scenario
13from core.auxiliary.models.Flowsheet import Flowsheet
15def transform_to_csv(data):
16 csv_data = []
17 for item in data:
18 for solveValue in item.get('solveValues'):
19 csv_data.append({'name': item.get('name'), 'value': solveValue.get('value')})
20 return csv_data
22class MSSRenderer (CSVRenderer):
23 header = ['name', 'value']
25@api_view_validate
26@extend_schema(parameters=[
27 OpenApiParameter(name="flowsheet", required=True, type=OpenApiTypes.INT),
28])
29@api_view(['GET'])
30@renderer_classes([MSSRenderer])
31def download_data(request):
32 """
33 This endpoint allows downloading of the input data for a multisteadystate simulation.
34 I am not sure if this has been updated to reflect the new Scenario model, or if
35 it is still used in the UI.
36 """
37 flowsheet_id = request.query_params.get("flowsheet")
38 if not flowsheet_id:
39 return Response(
40 {"error": "flowsheetId parameter is required."},
41 status=400
42 )
43 expressions = Expression.objects.filter(flowsheet=flowsheet_id)
44 serialized_data = ExpressionSerializer(expressions, many=True).data
46 csv_data = transform_to_csv(serialized_data)
48 response = HttpResponse(content_type='text/csv')
49 response['Content-Disposition'] = 'attachment; filename="export.csv"'
50 writer = csv.DictWriter(response, fieldnames=['name', 'value'])
51 writer.writeheader()
52 writer.writerows(csv_data)
54 return response
56@api_view_validate
57@extend_schema(parameters=[
58 OpenApiParameter(name="flowsheet", required=True, type=OpenApiTypes.INT),
59 OpenApiParameter(name="scenario", required=True, type=OpenApiTypes.INT),
60])
61@api_view(['GET'])
62@renderer_classes([CSVRenderer])
63def download_mss_results(request):
64 """
65 This endpoint allows downloading of the results data for a multisteadystate simulation.
66 """
67 flowsheet_id = request.query_params.get("flowsheet")
68 scenario_id = request.query_params.get("scenario")
69 flowsheet = Flowsheet.objects.get(pk=flowsheet_id)
70 scenario = Scenario.objects.get(pk=scenario_id, flowsheet=flowsheet)
71 data = export_scenario_data(flowsheet, scenario)
72 response = HttpResponse(content_type='text/csv')
73 response['Content-Disposition'] = 'attachment; filename="data.csv"'
74 writer = csv.DictWriter(response, fieldnames=data.keys())
75 writer.writeheader()
76 writer.writerows(collate(data))
78 return response