106 lines
4.1 KiB
Python
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
|