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