Coverage for backend/PinchAnalysis/views/PinchUtilityViewSet.py: 42%
60 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.viewset import ModelViewSet
2from PinchAnalysis.serializers.PinchInputSerializers import PinchUtilitySerializer
3from PinchAnalysis.models.InputModels import PinchInputs, PinchUtility
4from drf_spectacular.utils import extend_schema, OpenApiParameter, OpenApiTypes
5from rest_framework.response import Response
6from rest_framework import serializers
7from rest_framework.decorators import action
8import traceback
9from PinchAnalysis.models.StreamDataProject import StreamDataProject
11class BulkCreateUtilitiesSerializer(serializers.Serializer):
12 projectID = serializers.IntegerField(required=True)
13 utilities = serializers.ListField(
14 child=serializers.DictField(),
15 required=True,
16 )
18class DeleteAllUtilitiesSerializer(serializers.Serializer):
19 projectID = serializers.IntegerField(required=True)
21class PinchUtilityViewSet(ModelViewSet):
22 serializer_class = PinchUtilitySerializer
24 def get_queryset(self):
25 queryset = PinchUtility.objects.all()
26 projectId = self.request.query_params.get("projectOwner")
27 if projectId is not None:
28 pinch_inputs = PinchInputs.objects.filter(project_owner_id=projectId)
29 queryset = queryset.filter(input_owner__in=pinch_inputs)
30 return queryset
32 @extend_schema(
33 parameters=[
34 OpenApiParameter(name="projectOwner", required=True, type=OpenApiTypes.INT),
35 ]
36 )
38 def list(self, request):
39 return super().list(request)
42 @extend_schema(request=BulkCreateUtilitiesSerializer, responses=None)
43 @action(methods=['post'], detail=False, url_path='bulk-create')
44 def bulk_create(self, request):
45 try:
46 serializer = BulkCreateUtilitiesSerializer(data=request.data)
47 serializer.is_valid(raise_exception=True)
48 validated_data = serializer.validated_data
50 projectID = validated_data.get("projectID")
51 flowsheet = request.query_params.get("flowsheet")
52 project = StreamDataProject.objects.get(pk=projectID)
53 utilities = validated_data.get("utilities")
55 utility_objects = [
56 PinchUtility(input_owner=project.Inputs, flowsheet_id=flowsheet, **stream) for stream in utilities
57 ]
59 PinchUtility.objects.bulk_create(utility_objects)
61 return Response({'status': 'success'}, status=201)
62 except Exception as e:
63 return self.error_response(e)
66 @extend_schema(request=DeleteAllUtilitiesSerializer, responses=None)
67 @action(methods=['post'], detail=False, url_path='delete-all')
68 def delete_all(self, request):
69 try:
70 serializer = DeleteAllUtilitiesSerializer(data=request.data)
71 serializer.is_valid(raise_exception=True)
72 validated_data = serializer.validated_data
74 projectID = validated_data.get("projectID")
75 project = StreamDataProject.objects.get(pk=projectID)
77 project.Inputs.PinchUtilities.all().delete()
79 return Response({'status': 'success'}, status=204)
80 except Exception as e:
81 return self.error_response(e)
83 def error_response(self, e):
84 tb_info = traceback.format_exc()
85 error_message = str(e)
86 response_data = {'status': 'error', 'message': error_message, 'traceback': tb_info}
87 return Response(response_data, status=400)