165 lines
4.5 KiB
Python
165 lines
4.5 KiB
Python
from rest_framework import serializers
|
|
|
|
from .models import (
|
|
NodeAssignment,
|
|
Transition,
|
|
Workflow,
|
|
WorkflowInstance,
|
|
WorkflowNode,
|
|
WorkflowObserver,
|
|
)
|
|
|
|
|
|
class WorkflowSerializer(serializers.ModelSerializer):
|
|
created_by_info = serializers.SerializerMethodField()
|
|
|
|
class Meta:
|
|
model = Workflow
|
|
fields = [
|
|
"id",
|
|
"slug",
|
|
"name",
|
|
"description",
|
|
"is_active",
|
|
"created_by",
|
|
"created_by_info",
|
|
]
|
|
read_only_fields = ["id"]
|
|
|
|
def get_created_by_info(self, obj):
|
|
if obj.created_by_id:
|
|
return {"id": obj.created_by_id, "display": str(obj.created_by)}
|
|
return None
|
|
|
|
|
|
class WorkflowNodeSerializer(serializers.ModelSerializer):
|
|
workflow_info = serializers.SerializerMethodField()
|
|
|
|
class Meta:
|
|
model = WorkflowNode
|
|
fields = [
|
|
"id",
|
|
"workflow",
|
|
"workflow_info",
|
|
"name",
|
|
"node_type",
|
|
"min_approvals",
|
|
"approval_strategy",
|
|
"position_x",
|
|
"position_y",
|
|
]
|
|
read_only_fields = ["id"]
|
|
|
|
def get_workflow_info(self, obj):
|
|
return {"id": obj.workflow_id, "slug": obj.workflow.slug, "name": obj.workflow.name}
|
|
|
|
|
|
class TransitionSerializer(serializers.ModelSerializer):
|
|
from_node_info = serializers.SerializerMethodField()
|
|
to_node_info = serializers.SerializerMethodField()
|
|
|
|
class Meta:
|
|
model = Transition
|
|
fields = [
|
|
"id",
|
|
"from_node",
|
|
"from_node_info",
|
|
"to_node",
|
|
"to_node_info",
|
|
"condition_slug",
|
|
"is_default",
|
|
]
|
|
read_only_fields = ["id"]
|
|
|
|
def get_from_node_info(self, obj):
|
|
return {"id": obj.from_node_id, "name": obj.from_node.name}
|
|
|
|
def get_to_node_info(self, obj):
|
|
return {"id": obj.to_node_id, "name": obj.to_node.name}
|
|
|
|
|
|
class WorkflowInstanceSerializer(serializers.ModelSerializer):
|
|
workflow_info = serializers.SerializerMethodField()
|
|
current_node_info = serializers.SerializerMethodField()
|
|
owner_info = serializers.SerializerMethodField()
|
|
|
|
class Meta:
|
|
model = WorkflowInstance
|
|
fields = [
|
|
"id",
|
|
"workflow",
|
|
"workflow_info",
|
|
"current_node",
|
|
"current_node_info",
|
|
"owner",
|
|
"owner_info",
|
|
"status",
|
|
"started_at",
|
|
"completed_at",
|
|
"metadata",
|
|
]
|
|
read_only_fields = ["id", "started_at", "completed_at"]
|
|
|
|
def get_workflow_info(self, obj):
|
|
return {"id": obj.workflow_id, "slug": obj.workflow.slug, "name": obj.workflow.name}
|
|
|
|
def get_current_node_info(self, obj):
|
|
if obj.current_node_id:
|
|
return {"id": obj.current_node_id, "name": obj.current_node.name}
|
|
return None
|
|
|
|
def get_owner_info(self, obj):
|
|
if obj.owner_id:
|
|
return {"id": obj.owner_id, "display": str(obj.owner)}
|
|
return None
|
|
|
|
|
|
class NodeAssignmentSerializer(serializers.ModelSerializer):
|
|
instance_info = serializers.SerializerMethodField()
|
|
node_info = serializers.SerializerMethodField()
|
|
user_info = serializers.SerializerMethodField()
|
|
|
|
class Meta:
|
|
model = NodeAssignment
|
|
fields = [
|
|
"id",
|
|
"instance",
|
|
"instance_info",
|
|
"node",
|
|
"node_info",
|
|
"user",
|
|
"user_info",
|
|
"visit_number",
|
|
"is_required",
|
|
"has_processed",
|
|
"decision",
|
|
"comments",
|
|
"submitted_data",
|
|
"processed_at",
|
|
]
|
|
read_only_fields = ["id", "processed_at"]
|
|
|
|
def get_instance_info(self, obj):
|
|
return {"id": obj.instance_id}
|
|
|
|
def get_node_info(self, obj):
|
|
return {"id": obj.node_id, "name": obj.node.name}
|
|
|
|
def get_user_info(self, obj):
|
|
return {"id": obj.user_id, "display": str(obj.user)}
|
|
|
|
|
|
class WorkflowObserverSerializer(serializers.ModelSerializer):
|
|
instance_info = serializers.SerializerMethodField()
|
|
user_info = serializers.SerializerMethodField()
|
|
|
|
class Meta:
|
|
model = WorkflowObserver
|
|
fields = ["id", "instance", "instance_info", "user", "user_info"]
|
|
read_only_fields = ["id"]
|
|
|
|
def get_instance_info(self, obj):
|
|
return {"id": obj.instance_id}
|
|
|
|
def get_user_info(self, obj):
|
|
return {"id": obj.user_id, "display": str(obj.user)}
|