Coverage for backend/django/flowsheetInternals/graphicData/viewsets/GraphicObjectViewSet.py: 100%

48 statements  

« prev     ^ index     » next       coverage.py v7.10.7, created at 2026-06-23 21:51 +0000

1from core.auxiliary.models import PropertyInfo 

2from core.auxiliary.models.PropertyValue import PropertyValue 

3from core.viewset import ModelViewSet 

4from django.db import transaction 

5from django.db.models import Q 

6from flowsheetInternals.graphicData.models.groupingModel import Grouping 

7from flowsheetInternals.graphicData.services.auto_sort import auto_sort 

8from flowsheetInternals.unitops.models.Port import Port 

9from flowsheetInternals.graphicData.serializers.graphicObjectSerializer import ( 

10 GraphicObjectSerializer, 

11) 

12from flowsheetInternals.graphicData.models.graphicObjectModel import GraphicObject 

13from drf_spectacular.utils import extend_schema, OpenApiParameter, OpenApiTypes 

14from django.db.models import Prefetch 

15from rest_framework import serializers 

16from rest_framework.decorators import action 

17from rest_framework.response import Response 

18 

19 

20class AutoSortCanvasSerializer(serializers.Serializer): 

21 group = serializers.IntegerField() 

22 

23 

24class AutoSortPositionSerializer(serializers.Serializer): 

25 x = serializers.FloatField() 

26 y = serializers.FloatField() 

27 

28 

29class AutoSortMovedObjectSerializer(serializers.Serializer): 

30 objectId = serializers.IntegerField() 

31 graphicObjectId = serializers.IntegerField() 

32 oldPosition = AutoSortPositionSerializer() 

33 newPosition = AutoSortPositionSerializer() 

34 

35 

36class AutoSortCanvasResponseSerializer(serializers.Serializer): 

37 movedObjects = AutoSortMovedObjectSerializer(many=True) 

38 

39 

40class GraphicObjectViewSet(ModelViewSet): 

41 serializer_class = GraphicObjectSerializer 

42 write_actions = {"auto_sort"} 

43 

44 def get_queryset(self): 

45 queryset = GraphicObject.objects.filter( 

46 simulationObject__is_deleted=False 

47 ).select_related( 

48 "simulationObject", # get related simulationObject in one query 

49 ).prefetch_related( 

50 Prefetch( 

51 "simulationObject__grouping", 

52 queryset=Grouping.objects.only("id"), 

53 ), 

54 Prefetch( 

55 "simulationObject__connectedPorts", 

56 # optimise connectedPorts relationships 

57 queryset=Port.objects.select_related("unitOp", "stream"), 

58 ), 

59 Prefetch( 

60 "simulationObject__properties__ContainedProperties", 

61 queryset=PropertyInfo.objects 

62 .select_related("recycleConnection") 

63 .prefetch_related( 

64 Prefetch( 

65 "values", 

66 queryset=PropertyValue.objects 

67 .select_related( 

68 "controlManipulated", 

69 "controlSetPoint", 

70 ) 

71 .prefetch_related("indexedItems"), 

72 ) 

73 ) 

74 ) 

75 ) 

76 

77 groupId = self.request.query_params.get("group") 

78 if groupId is not None: 

79 queryset = queryset.filter(group_id=groupId) 

80 return queryset 

81 

82 @extend_schema( 

83 parameters=[ 

84 OpenApiParameter( 

85 name="flowsheet", 

86 required=False, 

87 type=OpenApiTypes.INT, 

88 ), 

89 OpenApiParameter( 

90 name="group", 

91 required=False, 

92 type=OpenApiTypes.INT, 

93 ), 

94 ] 

95 ) 

96 def list(self, request): 

97 return super().list(request) 

98 

99 @extend_schema( 

100 request=AutoSortCanvasSerializer, 

101 responses=AutoSortCanvasResponseSerializer, 

102 parameters=[ 

103 OpenApiParameter(name="flowsheet", required=True, type=OpenApiTypes.INT), 

104 ], 

105 ) 

106 @action(detail=False, methods=["post"], url_path="auto-sort") 

107 def auto_sort(self, request): 

108 serializer = AutoSortCanvasSerializer(data=request.data) 

109 serializer.is_valid(raise_exception=True) 

110 group_id = serializer.validated_data["group"] 

111 flowsheet_id = request.query_params.get("flowsheet") 

112 

113 moved_objects = auto_sort(flowsheet_id,group_id) 

114 

115 

116 return Response({"movedObjects": moved_objects}, status=200)