Coverage for backend/django/core/auxiliary/views/DownloadMSSData.py: 42%
58 statements
« prev ^ index » next coverage.py v7.10.7, created at 2025-12-18 04:00 +0000
« prev ^ index » next coverage.py v7.10.7, created at 2025-12-18 04:00 +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
14import json
16def transform_to_csv(data):
17 csv_data = []
18 for item in data:
19 for solveValue in item.get('solveValues'):
20 csv_data.append({'name': item.get('name'), 'value': solveValue.get('value')})
21 return csv_data
23class MSSRenderer (CSVRenderer):
24 header = ['name', 'value']
26@api_view_validate
27@extend_schema(parameters=[
28 OpenApiParameter(name="flowsheet", required=True, type=OpenApiTypes.INT),
29])
30@api_view(['GET'])
31@renderer_classes([MSSRenderer])
32def download_data(request):
33 """
34 This endpoint allows downloading of the input data for a multisteadystate simulation.
35 I am not sure if this has been updated to reflect the new Scenario model, or if
36 it is still used in the UI.
37 """
38 flowsheet_id = request.query_params.get("flowsheet")
39 if not flowsheet_id:
40 return Response(
41 {"error": "flowsheetId parameter is required."},
42 status=400
43 )
44 expressions = Expression.objects.filter(flowsheet=flowsheet_id)
45 serialized_data = ExpressionSerializer(expressions, many=True).data
47 csv_data = transform_to_csv(serialized_data)
49 response = HttpResponse(content_type='text/csv')
50 response['Content-Disposition'] = 'attachment; filename="export.csv"'
51 writer = csv.DictWriter(response, fieldnames=['name', 'value'])
52 writer.writeheader()
53 writer.writerows(csv_data)
55 return response
57@api_view_validate
58@extend_schema(parameters=[
59 OpenApiParameter(name="flowsheet", required=True, type=OpenApiTypes.INT),
60 OpenApiParameter(name="scenario", required=True, type=OpenApiTypes.STR),
61 # For some reason, i can't seem to add more paramaters or change the name to something else, so i have to resort to packing everything into a json string
62])
63@api_view(['GET'])
64@renderer_classes([CSVRenderer])
65def download_mss_results(request):
66 """
67 This endpoint allows downloading of the results data for a multisteadystate simulation.
68 """
69 flowsheet_id = request.query_params.get("flowsheet")
70 payload = request.query_params.get("scenario")
71 payload = json.loads(payload)
72 scenario_id = int(payload.get("scenario"))
73 properties = json.loads(payload.get("properties", "[]"))
75 flowsheet = Flowsheet.objects.get(pk=flowsheet_id)
76 scenario = Scenario.objects.get(pk=scenario_id, flowsheet=flowsheet)
77 data = export_scenario_data(flowsheet, scenario, properties)
78 response = HttpResponse(content_type='text/csv')
79 response['Content-Disposition'] = 'attachment; filename="data.csv"'
80 writer = csv.DictWriter(response, fieldnames=data.keys())
81 writer.writeheader()
82 writer.writerows(collate(data))
84 return response