infrasynth-backend-kit/infrasynth/workflows/serializers.py
2026-08-28 14:38:47 -05:00

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