agdar/referrals/serializers.py
Marwan Alwali 2f1681b18c update
2025-11-11 13:44:48 +03:00

106 lines
4.1 KiB
Python

"""
DRF Serializers for Referrals app.
"""
from rest_framework import serializers
from .models import Referral
from core.serializers import PatientListSerializer, ClinicSerializer
class ReferralListSerializer(serializers.ModelSerializer):
"""Lightweight serializer for referral lists."""
patient_name = serializers.CharField(source='patient.get_full_name', read_only=True)
from_clinic_name = serializers.CharField(source='from_clinic.name_en', read_only=True)
to_clinic_name = serializers.CharField(source='to_clinic.name_en', read_only=True)
from_provider_name = serializers.CharField(source='from_provider.get_full_name', read_only=True)
status_display = serializers.CharField(source='get_status_display', read_only=True)
urgency_display = serializers.CharField(source='get_urgency_display', read_only=True)
class Meta:
model = Referral
fields = [
'id', 'patient', 'patient_name',
'from_clinic', 'from_clinic_name',
'to_clinic', 'to_clinic_name',
'from_provider', 'from_provider_name',
'is_internal', 'external_provider_name',
'urgency', 'urgency_display',
'status', 'status_display',
'created_at'
]
read_only_fields = ['id', 'created_at']
class ReferralDetailSerializer(serializers.ModelSerializer):
"""Detailed serializer for referral detail views."""
patient = PatientListSerializer(read_only=True)
from_clinic = ClinicSerializer(read_only=True)
to_clinic = ClinicSerializer(read_only=True)
from_provider_name = serializers.CharField(source='from_provider.get_full_name', read_only=True)
to_provider_name = serializers.CharField(source='to_provider.get_full_name', read_only=True)
status_display = serializers.CharField(source='get_status_display', read_only=True)
urgency_display = serializers.CharField(source='get_urgency_display', read_only=True)
class Meta:
model = Referral
fields = [
'id', 'patient', 'from_clinic', 'to_clinic',
'from_provider', 'from_provider_name',
'to_provider', 'to_provider_name',
'is_internal', 'external_provider_name', 'external_provider_contact',
'reason', 'clinical_summary',
'urgency', 'urgency_display',
'status', 'status_display',
'response_notes', 'responded_at', 'completed_at',
'notes', 'created_at', 'updated_at'
]
read_only_fields = ['id', 'created_at', 'updated_at', 'responded_at', 'completed_at']
class ReferralCreateSerializer(serializers.ModelSerializer):
"""Serializer for creating referrals."""
class Meta:
model = Referral
fields = [
'patient', 'from_clinic', 'to_clinic',
'from_provider', 'to_provider',
'external_provider_name', 'external_provider_contact',
'reason', 'clinical_summary', 'urgency', 'notes'
]
def validate(self, data):
"""Validate referral data."""
# Check if internal or external
to_clinic = data.get('to_clinic')
external_provider_name = data.get('external_provider_name')
if not to_clinic and not external_provider_name:
raise serializers.ValidationError(
"Either to_clinic or external_provider_name must be provided"
)
if to_clinic and external_provider_name:
raise serializers.ValidationError(
"Cannot specify both internal clinic and external provider"
)
# Set is_internal flag
data['is_internal'] = bool(to_clinic)
return data
class ReferralResponseSerializer(serializers.Serializer):
"""Serializer for referral responses (accept/reject)."""
response_notes = serializers.CharField(required=True)
def validate_response_notes(self, value):
"""Ensure response notes are provided."""
if not value or not value.strip():
raise serializers.ValidationError("Response notes are required")
return value