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"}