165 lines
6.0 KiB
Python
165 lines
6.0 KiB
Python
"""
|
|
Complaints serializers
|
|
"""
|
|
from rest_framework import serializers
|
|
|
|
from .models import Complaint, ComplaintAttachment, ComplaintUpdate, Inquiry
|
|
|
|
|
|
class ComplaintAttachmentSerializer(serializers.ModelSerializer):
|
|
"""Complaint attachment serializer"""
|
|
uploaded_by_name = serializers.SerializerMethodField()
|
|
|
|
class Meta:
|
|
model = ComplaintAttachment
|
|
fields = [
|
|
'id', 'complaint', 'file', 'filename', 'file_type', 'file_size',
|
|
'uploaded_by', 'uploaded_by_name', 'description',
|
|
'created_at', 'updated_at'
|
|
]
|
|
read_only_fields = ['id', 'file_size', 'created_at', 'updated_at']
|
|
|
|
def get_uploaded_by_name(self, obj):
|
|
"""Get uploader name"""
|
|
if obj.uploaded_by:
|
|
return obj.uploaded_by.get_full_name()
|
|
return None
|
|
|
|
|
|
class ComplaintUpdateSerializer(serializers.ModelSerializer):
|
|
"""Complaint update serializer"""
|
|
created_by_name = serializers.SerializerMethodField()
|
|
|
|
class Meta:
|
|
model = ComplaintUpdate
|
|
fields = [
|
|
'id', 'complaint', 'update_type', 'message',
|
|
'created_by', 'created_by_name',
|
|
'old_status', 'new_status', 'metadata',
|
|
'created_at', 'updated_at'
|
|
]
|
|
read_only_fields = ['id', 'created_at', 'updated_at']
|
|
|
|
def get_created_by_name(self, obj):
|
|
"""Get creator name"""
|
|
if obj.created_by:
|
|
return obj.created_by.get_full_name()
|
|
return None
|
|
|
|
|
|
class ComplaintSerializer(serializers.ModelSerializer):
|
|
"""Complaint serializer"""
|
|
patient_name = serializers.CharField(source='patient.get_full_name', read_only=True)
|
|
patient_mrn = serializers.CharField(source='patient.mrn', read_only=True)
|
|
hospital_name = serializers.CharField(source='hospital.name', read_only=True)
|
|
department_name = serializers.CharField(source='department.name', read_only=True)
|
|
physician_name = serializers.SerializerMethodField()
|
|
assigned_to_name = serializers.SerializerMethodField()
|
|
attachments = ComplaintAttachmentSerializer(many=True, read_only=True)
|
|
updates = ComplaintUpdateSerializer(many=True, read_only=True)
|
|
sla_status = serializers.SerializerMethodField()
|
|
|
|
class Meta:
|
|
model = Complaint
|
|
fields = [
|
|
'id', 'patient', 'patient_name', 'patient_mrn', 'encounter_id',
|
|
'hospital', 'hospital_name', 'department', 'department_name',
|
|
'physician', 'physician_name',
|
|
'title', 'description', 'category', 'subcategory',
|
|
'priority', 'severity', 'source', 'status',
|
|
'assigned_to', 'assigned_to_name', 'assigned_at',
|
|
'due_at', 'is_overdue', 'sla_status',
|
|
'reminder_sent_at', 'escalated_at',
|
|
'resolution', 'resolved_at', 'resolved_by',
|
|
'closed_at', 'closed_by',
|
|
'resolution_survey', 'resolution_survey_sent_at',
|
|
'attachments', 'updates', 'metadata',
|
|
'created_at', 'updated_at'
|
|
]
|
|
read_only_fields = [
|
|
'id', 'assigned_at', 'is_overdue',
|
|
'reminder_sent_at', 'escalated_at',
|
|
'resolved_at', 'closed_at', 'resolution_survey_sent_at',
|
|
'created_at', 'updated_at'
|
|
]
|
|
|
|
def get_physician_name(self, obj):
|
|
"""Get physician name"""
|
|
if obj.physician:
|
|
return obj.physician.get_full_name()
|
|
return None
|
|
|
|
def get_assigned_to_name(self, obj):
|
|
"""Get assigned user name"""
|
|
if obj.assigned_to:
|
|
return obj.assigned_to.get_full_name()
|
|
return None
|
|
|
|
def get_sla_status(self, obj):
|
|
"""Get SLA status"""
|
|
if obj.is_overdue:
|
|
return 'overdue'
|
|
|
|
from django.utils import timezone
|
|
time_remaining = obj.due_at - timezone.now()
|
|
hours_remaining = time_remaining.total_seconds() / 3600
|
|
|
|
if hours_remaining < 4:
|
|
return 'due_soon'
|
|
return 'on_time'
|
|
|
|
|
|
class ComplaintListSerializer(serializers.ModelSerializer):
|
|
"""Simplified complaint serializer for list views"""
|
|
patient_name = serializers.CharField(source='patient.get_full_name', read_only=True)
|
|
hospital_name = serializers.CharField(source='hospital.name', read_only=True)
|
|
sla_status = serializers.SerializerMethodField()
|
|
|
|
class Meta:
|
|
model = Complaint
|
|
fields = [
|
|
'id', 'title', 'patient_name', 'hospital_name',
|
|
'category', 'severity', 'status', 'sla_status',
|
|
'assigned_to', 'created_at'
|
|
]
|
|
|
|
def get_sla_status(self, obj):
|
|
"""Get SLA status"""
|
|
if obj.is_overdue:
|
|
return 'overdue'
|
|
|
|
from django.utils import timezone
|
|
time_remaining = obj.due_at - timezone.now()
|
|
hours_remaining = time_remaining.total_seconds() / 3600
|
|
|
|
if hours_remaining < 4:
|
|
return 'due_soon'
|
|
return 'on_time'
|
|
|
|
|
|
class InquirySerializer(serializers.ModelSerializer):
|
|
"""Inquiry serializer"""
|
|
patient_name = serializers.CharField(source='patient.get_full_name', read_only=True)
|
|
hospital_name = serializers.CharField(source='hospital.name', read_only=True)
|
|
department_name = serializers.CharField(source='department.name', read_only=True)
|
|
assigned_to_name = serializers.SerializerMethodField()
|
|
|
|
class Meta:
|
|
model = Inquiry
|
|
fields = [
|
|
'id', 'patient', 'patient_name',
|
|
'contact_name', 'contact_phone', 'contact_email',
|
|
'hospital', 'hospital_name', 'department', 'department_name',
|
|
'subject', 'message', 'category', 'status',
|
|
'assigned_to', 'assigned_to_name',
|
|
'response', 'responded_at', 'responded_by',
|
|
'created_at', 'updated_at'
|
|
]
|
|
read_only_fields = ['id', 'responded_at', 'created_at', 'updated_at']
|
|
|
|
def get_assigned_to_name(self, obj):
|
|
"""Get assigned user name"""
|
|
if obj.assigned_to:
|
|
return obj.assigned_to.get_full_name()
|
|
return None
|