Coverage for backend/django/core/auxiliary/viewsets/MLColumnMappingsViewSet.py: 88%
73 statements
« prev ^ index » next coverage.py v7.10.7, created at 2026-07-22 05:22 +0000
« prev ^ index » next coverage.py v7.10.7, created at 2026-07-22 05:22 +0000
1from django.db import IntegrityError, transaction
2from core.viewset import ModelViewSet
3from core.auxiliary.models.MLColumnMapping import MLColumnMapping
4from core.auxiliary.models.Flowsheet import Flowsheet
5from rest_framework import serializers
6from core.auxiliary.serializers.MLColumnMappingsSerializer import MLColumnMappingsSerializer
7from rest_framework.response import Response
8from drf_spectacular.utils import extend_schema
9from rest_framework.decorators import action
10from core.auxiliary.serializers.PropertyInfoSerializer import PropertyInfoSerializer
11from drf_spectacular.utils import extend_schema
12from rest_framework.exceptions import NotFound, ValidationError
13from core.auxiliary.models.MLWizard import create_column_mapping
14from core.auxiliary.models.MLModel import MLModel
15from core.auxiliary.services.ml_column_mapping_updates import (
16 replace_column_mapping as replace_column_mapping_service,
17)
19class ColumnMappingSerializer(serializers.Serializer):
20 portIndex = serializers.IntegerField()
21 propertyKey = serializers.CharField()
22 column = serializers.CharField()
24class BulkCreateColumnMappingSerializer(serializers.Serializer):
25 model = serializers.IntegerField()
26 inlet_mappings = serializers.ListField(child=ColumnMappingSerializer())
27 outlet_mappings = serializers.ListField(child=ColumnMappingSerializer())
28class PropertyInfoIdsSerializer(serializers.Serializer):
29 inlets = serializers.ListField(child=PropertyInfoSerializer())
30 outlets = serializers.ListField(child=PropertyInfoSerializer())
33class MLColumnMappingsViewSet(ModelViewSet):
34 serializer_class = MLColumnMappingsSerializer
35 write_actions = {"bulk_create_column_mapping", "replace_column_mapping"}
37 def get_queryset(self):
38 return MLColumnMapping.objects.all()
40 def get_flowsheet_from_request(self, request):
41 flowsheet_id = request.query_params.get("flowsheet")
42 if not flowsheet_id: 42 ↛ 43line 42 didn't jump to line 43 because the condition on line 42 was never true
43 raise ValidationError({"flowsheet": "flowsheet query parameter is required."})
45 try:
46 return Flowsheet.objects.get(pk=flowsheet_id)
47 except Flowsheet.DoesNotExist as exc:
48 raise NotFound({"flowsheet": "Flowsheet not found."}) from exc
50 @transaction.atomic
51 @extend_schema(request=BulkCreateColumnMappingSerializer, responses=None)
52 @action(detail=False, methods=['post'], url_path='bulk-create-column-mapping')
53 def bulk_create_column_mapping(self, request):
54 serializer = BulkCreateColumnMappingSerializer(data=request.data)
55 serializer.is_valid(raise_exception=True)
56 validated_data = serializer.validated_data
57 model = validated_data.get("model")
58 inlet_mappings = validated_data.get("inlet_mappings")
59 outlet_mappings = validated_data.get("outlet_mappings")
60 flowsheet = self.get_flowsheet_from_request(request)
61 try:
62 create_column_mapping(flowsheet, model, inlet_mappings, outlet_mappings)
63 except Exception as e:
64 print(ValidationError(str(e)))
65 return Response({'status': 'error'}, status=400)
67 return Response({'status': 'success'}, status=200)
69 @extend_schema(request=BulkCreateColumnMappingSerializer, responses=None)
70 @action(detail=False, methods=['post'], url_path='replace-column-mapping')
71 def replace_column_mapping(self, request):
72 serializer = BulkCreateColumnMappingSerializer(data=request.data)
73 serializer.is_valid(raise_exception=True)
74 validated_data = serializer.validated_data
75 model = validated_data.get("model")
76 inlet_mappings = validated_data.get("inlet_mappings")
77 outlet_mappings = validated_data.get("outlet_mappings")
78 flowsheet = self.get_flowsheet_from_request(request)
79 try:
80 replace_column_mapping_service(
81 flowsheet=flowsheet,
82 model=model,
83 inlet_mappings=inlet_mappings,
84 outlet_mappings=outlet_mappings,
85 )
86 except MLModel.DoesNotExist as exc:
87 raise NotFound({"model": "ML model not found."}) from exc
88 except IntegrityError as exc:
89 raise ValidationError({"mappings": "Column mappings could not be replaced."}) from exc
91 return Response({'status': 'success'}, status=200)