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
« 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
20class AutoSortCanvasSerializer(serializers.Serializer):
21 group = serializers.IntegerField()
24class AutoSortPositionSerializer(serializers.Serializer):
25 x = serializers.FloatField()
26 y = serializers.FloatField()
29class AutoSortMovedObjectSerializer(serializers.Serializer):
30 objectId = serializers.IntegerField()
31 graphicObjectId = serializers.IntegerField()
32 oldPosition = AutoSortPositionSerializer()
33 newPosition = AutoSortPositionSerializer()
36class AutoSortCanvasResponseSerializer(serializers.Serializer):
37 movedObjects = AutoSortMovedObjectSerializer(many=True)
40class GraphicObjectViewSet(ModelViewSet):
41 serializer_class = GraphicObjectSerializer
42 write_actions = {"auto_sort"}
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 )
77 groupId = self.request.query_params.get("group")
78 if groupId is not None:
79 queryset = queryset.filter(group_id=groupId)
80 return queryset
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)
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")
113 moved_objects = auto_sort(flowsheet_id,group_id)
116 return Response({"movedObjects": moved_objects}, status=200)