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

53 statements  

« prev     ^ index     » next       coverage.py v7.10.7, created at 2026-07-22 05:22 +0000

1from core.auxiliary.models import PropertyInfo 

2from core.auxiliary.models.PropertyValue import PropertyValue 

3from core.viewset import ModelViewSet 

4from flowsheetInternals.graphicData.models.groupingModel import Grouping 

5from flowsheetInternals.graphicData.services.auto_sort import auto_sort 

6from flowsheetInternals.unitops.models.Port import Port 

7from flowsheetInternals.unitops.models.FlowsheetEditOperation import ( 

8 FlowsheetEditOperation, 

9) 

10from flowsheetInternals.graphicData.serializers.graphicObjectSerializer import ( 

11 GraphicObjectSerializer, 

12) 

13from flowsheetInternals.graphicData.models.graphicObjectModel import GraphicObject 

14from core.auxiliary.models.Flowsheet import Flowsheet 

15from drf_spectacular.utils import extend_schema, OpenApiParameter, OpenApiTypes 

16from django.db.models import Prefetch 

17from rest_framework import serializers 

18from rest_framework.decorators import action 

19from rest_framework.response import Response 

20from flowsheetInternals.unitops.services.edit_operations.mixins import ( 

21 FlowsheetHistoryUpdateMixin, 

22) 

23from flowsheetInternals.unitops.services.edit_operations.mutation import flowsheet_edit 

24 

25 

26class AutoSortCanvasSerializer(serializers.Serializer): 

27 group = serializers.IntegerField() 

28 

29 

30class AutoSortPositionSerializer(serializers.Serializer): 

31 x = serializers.FloatField() 

32 y = serializers.FloatField() 

33 

34 

35class AutoSortMovedObjectSerializer(serializers.Serializer): 

36 objectId = serializers.IntegerField() 

37 graphicObjectId = serializers.IntegerField() 

38 oldPosition = AutoSortPositionSerializer() 

39 newPosition = AutoSortPositionSerializer() 

40 

41 

42class AutoSortCanvasResponseSerializer(serializers.Serializer): 

43 movedObjects = AutoSortMovedObjectSerializer(many=True) 

44 

45 

46class GraphicObjectViewSet(FlowsheetHistoryUpdateMixin, ModelViewSet): 

47 """Expose graphics with declarative reversible scalar updates.""" 

48 

49 serializer_class = GraphicObjectSerializer 

50 history_label = "Move or resize object" 

51 history_kind = FlowsheetEditOperation.Kind.Move 

52 

53 def get_queryset(self): 

54 queryset = GraphicObject.objects.filter( 

55 simulationObject__is_deleted=False 

56 ).select_related( 

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

58 ).prefetch_related( 

59 Prefetch( 

60 "simulationObject__grouping", 

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

62 ), 

63 Prefetch( 

64 "simulationObject__connectedPorts", 

65 # optimise connectedPorts relationships 

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

67 ), 

68 Prefetch( 

69 "simulationObject__properties__ContainedProperties", 

70 queryset=PropertyInfo.objects 

71 .select_related("recycleConnection") 

72 .prefetch_related( 

73 Prefetch( 

74 "values", 

75 queryset=PropertyValue.objects 

76 .select_related( 

77 "controlManipulated", 

78 "controlSetPoint", 

79 ) 

80 .prefetch_related("indexedItems"), 

81 ) 

82 ) 

83 ) 

84 ) 

85 

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

87 if groupId is not None: 

88 queryset = queryset.filter(group_id=groupId) 

89 return queryset 

90 

91 @extend_schema( 

92 parameters=[ 

93 OpenApiParameter( 

94 name="flowsheet", 

95 required=False, 

96 type=OpenApiTypes.INT, 

97 ), 

98 OpenApiParameter( 

99 name="group", 

100 required=False, 

101 type=OpenApiTypes.INT, 

102 ), 

103 ] 

104 ) 

105 def list(self, request): 

106 return super().list(request) 

107 

108 @extend_schema( 

109 request=AutoSortCanvasSerializer, 

110 responses=AutoSortCanvasResponseSerializer, 

111 parameters=[ 

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

113 ], 

114 ) 

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

116 def auto_sort(self, request): 

117 serializer = AutoSortCanvasSerializer(data=request.data) 

118 serializer.is_valid(raise_exception=True) 

119 group_id = serializer.validated_data["group"] 

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

121 

122 flowsheet = Flowsheet.objects.get(pk=flowsheet_id) 

123 with flowsheet_edit( 

124 flowsheet=flowsheet, 

125 user=request.user, 

126 kind=FlowsheetEditOperation.Kind.Move, 

127 label_key="Auto-arrange flowsheet", 

128 ) as mutation: 

129 moved_objects = auto_sort(flowsheet_id, group_id) 

130 return Response( 

131 mutation.add_to_data({"movedObjects": moved_objects}), 

132 status=200, 

133 )