Files
cetana-backend/apps/workflows/views.py
T
2026-09-24 12:32:59 +03:30

67 lines
2.6 KiB
Python

from rest_framework import decorators, response, status, viewsets
from apps.core.errors import ApiError, error_response
from apps.rbac.permissions import ActionPermission
from apps.workflows.engine import WorkflowEngine
from apps.workflows.models import Workflow, WorkflowStep, WorkflowTransition, WorkflowVersion
from apps.workflows.serializers import (
WorkflowSerializer,
WorkflowStepSerializer,
WorkflowTransitionSerializer,
WorkflowVersionSerializer,
)
class WorkflowViewSet(viewsets.ModelViewSet):
queryset = Workflow.objects.all()
serializer_class = WorkflowSerializer
permission_classes = [ActionPermission]
code_map = {
"list": "workflow.view",
"retrieve": "workflow.view",
"create": "workflow.create",
"update": "workflow.update",
"partial_update": "workflow.update",
"destroy": "workflow.update",
"publish": "workflow.publish",
}
@decorators.action(detail=True, methods=["post"])
def publish(self, request, pk=None):
workflow = self.get_object()
version = workflow.versions.filter(status="draft").order_by("-version").first()
if version is None:
return response.Response(
error_response("WORKFLOW_INVALID", "No draft version to publish"),
status=status.HTTP_400_BAD_REQUEST,
)
try:
WorkflowEngine().publish(workflow, version)
except ApiError as exc:
return response.Response(error_response(exc.code, exc.message, exc.details), status=exc.status)
return response.Response(WorkflowSerializer(workflow).data)
class WorkflowVersionViewSet(viewsets.ModelViewSet):
queryset = WorkflowVersion.objects.all()
serializer_class = WorkflowVersionSerializer
permission_classes = [ActionPermission]
filterset_fields = ["workflow"]
code_map = {"create": "workflow.create", "update": "workflow.update", "partial_update": "workflow.update"}
class WorkflowStepViewSet(viewsets.ModelViewSet):
queryset = WorkflowStep.objects.all()
serializer_class = WorkflowStepSerializer
permission_classes = [ActionPermission]
filterset_fields = ["version", "key"]
code_map = {"create": "workflow.create", "update": "workflow.update", "partial_update": "workflow.update"}
class WorkflowTransitionViewSet(viewsets.ModelViewSet):
queryset = WorkflowTransition.objects.all()
serializer_class = WorkflowTransitionSerializer
permission_classes = [ActionPermission]
filterset_fields = ["version"]
code_map = {"create": "workflow.create", "update": "workflow.update", "partial_update": "workflow.update"}