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
« 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
26class AutoSortCanvasSerializer(serializers.Serializer):
27 group = serializers.IntegerField()
30class AutoSortPositionSerializer(serializers.Serializer):
31 x = serializers.FloatField()
32 y = serializers.FloatField()
35class AutoSortMovedObjectSerializer(serializers.Serializer):
36 objectId = serializers.IntegerField()
37 graphicObjectId = serializers.IntegerField()
38 oldPosition = AutoSortPositionSerializer()
39 newPosition = AutoSortPositionSerializer()
42class AutoSortCanvasResponseSerializer(serializers.Serializer):
43 movedObjects = AutoSortMovedObjectSerializer(many=True)
46class GraphicObjectViewSet(FlowsheetHistoryUpdateMixin, ModelViewSet):
47 """Expose graphics with declarative reversible scalar updates."""
49 serializer_class = GraphicObjectSerializer
50 history_label = "Move or resize object"
51 history_kind = FlowsheetEditOperation.Kind.Move
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 )
86 groupId = self.request.query_params.get("group")
87 if groupId is not None:
88 queryset = queryset.filter(group_id=groupId)
89 return queryset
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)
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")
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 )