Coverage for backend/django/flowsheetInternals/unitops/viewsets/FlowsheetEditOperationViewSet.py: 100%
29 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 drf_spectacular.utils import OpenApiParameter, OpenApiTypes, extend_schema
2from rest_framework import status
3from rest_framework.decorators import action
4from rest_framework.response import Response
6from core.viewset import ReadOnlyModelViewSet
7from flowsheetInternals.unitops.models.FlowsheetEditOperation import (
8 FlowsheetEditOperation,
9)
10from flowsheetInternals.unitops.serializers.FlowsheetEditOperationSerializer import (
11 FlowsheetEditOperationSerializer,
12 FlowsheetEditTransitionRequestSerializer,
13 FlowsheetEditTransitionSerializer,
14)
15from flowsheetInternals.unitops.services.edit_operations.service import (
16 CURRENT_SCHEMA_VERSION,
17 operation_response,
18 transition_operation,
19)
22class FlowsheetEditOperationViewSet(ReadOnlyModelViewSet):
23 """List and transition durable undo/redo operations for one flowsheet."""
25 serializer_class = FlowsheetEditOperationSerializer
27 def get_queryset(self):
28 return FlowsheetEditOperation.objects.filter(
29 flowsheet_id=self.request.query_params.get("flowsheet"),
30 schema_version=CURRENT_SCHEMA_VERSION,
31 ).exclude(state=FlowsheetEditOperation.State.Invalidated)
33 @extend_schema(
34 parameters=[
35 OpenApiParameter(name="flowsheet", required=True, type=OpenApiTypes.INT)
36 ]
37 )
38 def list(self, request):
39 return super().list(request)
41 @extend_schema(
42 request=FlowsheetEditTransitionRequestSerializer,
43 responses=FlowsheetEditTransitionSerializer,
44 parameters=[
45 OpenApiParameter(name="flowsheet", required=True, type=OpenApiTypes.INT)
46 ],
47 )
48 @action(detail=True, methods=["post"])
49 def undo(self, request, pk=None):
50 """Apply the inverse state for the latest eligible operation."""
51 request_serializer = FlowsheetEditTransitionRequestSerializer(data=request.data)
52 request_serializer.is_valid(raise_exception=True)
53 operation = transition_operation(
54 self.get_object(),
55 undo=True,
56 expected_revision=request_serializer.validated_data["expected_revision"],
57 )
58 return Response(operation_response(operation), status=status.HTTP_200_OK)
60 @extend_schema(
61 request=FlowsheetEditTransitionRequestSerializer,
62 responses=FlowsheetEditTransitionSerializer,
63 parameters=[
64 OpenApiParameter(name="flowsheet", required=True, type=OpenApiTypes.INT)
65 ],
66 )
67 @action(detail=True, methods=["post"])
68 def redo(self, request, pk=None):
69 """Reapply the forward state for the next eligible operation."""
70 request_serializer = FlowsheetEditTransitionRequestSerializer(data=request.data)
71 request_serializer.is_valid(raise_exception=True)
72 operation = transition_operation(
73 self.get_object(),
74 undo=False,
75 expected_revision=request_serializer.validated_data["expected_revision"],
76 )
77 return Response(operation_response(operation), status=status.HTTP_200_OK)