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

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 

15 

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 

22 

23class MSSRenderer (CSVRenderer): 

24 header = ['name', 'value'] 

25 

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 

46 

47 csv_data = transform_to_csv(serialized_data) 

48 

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) 

54 

55 return response 

56 

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", "[]")) 

74 

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)) 

83 

84 return response