67 lines
2.6 KiB
Python
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"}
|