HH/apps/complaints/serializers.py
2025-12-24 12:42:31 +03:00

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