84 lines
3.6 KiB
Python
84 lines
3.6 KiB
Python
"""
|
|
Physicians serializers
|
|
"""
|
|
from rest_framework import serializers
|
|
|
|
from apps.organizations.models import Physician
|
|
|
|
from .models import PhysicianMonthlyRating
|
|
|
|
|
|
class PhysicianSerializer(serializers.ModelSerializer):
|
|
"""Physician serializer"""
|
|
full_name = serializers.CharField(source='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)
|
|
|
|
class Meta:
|
|
model = Physician
|
|
fields = [
|
|
'id', 'first_name', 'last_name', 'first_name_ar', 'last_name_ar',
|
|
'full_name', 'license_number', 'specialization',
|
|
'hospital', 'hospital_name', 'department', 'department_name',
|
|
'phone', 'email', 'status',
|
|
'created_at', 'updated_at'
|
|
]
|
|
read_only_fields = ['id', 'created_at', 'updated_at']
|
|
|
|
|
|
class PhysicianMonthlyRatingSerializer(serializers.ModelSerializer):
|
|
"""Physician monthly rating serializer"""
|
|
physician_name = serializers.CharField(source='physician.get_full_name', read_only=True)
|
|
physician_license = serializers.CharField(source='physician.license_number', read_only=True)
|
|
hospital_name = serializers.CharField(source='physician.hospital.name', read_only=True)
|
|
department_name = serializers.CharField(source='physician.department.name', read_only=True)
|
|
month_name = serializers.SerializerMethodField()
|
|
|
|
class Meta:
|
|
model = PhysicianMonthlyRating
|
|
fields = [
|
|
'id', 'physician', 'physician_name', 'physician_license',
|
|
'hospital_name', 'department_name',
|
|
'year', 'month', 'month_name',
|
|
'average_rating', 'total_surveys',
|
|
'positive_count', 'neutral_count', 'negative_count',
|
|
'md_consult_rating',
|
|
'hospital_rank', 'department_rank',
|
|
'metadata',
|
|
'created_at', 'updated_at'
|
|
]
|
|
read_only_fields = ['id', 'created_at', 'updated_at']
|
|
|
|
def get_month_name(self, obj):
|
|
"""Get month name"""
|
|
months = [
|
|
'January', 'February', 'March', 'April', 'May', 'June',
|
|
'July', 'August', 'September', 'October', 'November', 'December'
|
|
]
|
|
return months[obj.month - 1] if 1 <= obj.month <= 12 else ''
|
|
|
|
|
|
class PhysicianLeaderboardSerializer(serializers.Serializer):
|
|
"""Physician leaderboard serializer"""
|
|
physician_id = serializers.UUIDField()
|
|
physician_name = serializers.CharField()
|
|
physician_license = serializers.CharField()
|
|
specialization = serializers.CharField()
|
|
department_name = serializers.CharField()
|
|
average_rating = serializers.DecimalField(max_digits=3, decimal_places=2)
|
|
total_surveys = serializers.IntegerField()
|
|
rank = serializers.IntegerField()
|
|
trend = serializers.CharField(required=False) # 'up', 'down', 'stable'
|
|
|
|
|
|
class PhysicianPerformanceSerializer(serializers.Serializer):
|
|
"""Physician performance summary serializer"""
|
|
physician = PhysicianSerializer()
|
|
current_month_rating = PhysicianMonthlyRatingSerializer(required=False, allow_null=True)
|
|
previous_month_rating = PhysicianMonthlyRatingSerializer(required=False, allow_null=True)
|
|
year_to_date_average = serializers.DecimalField(max_digits=3, decimal_places=2, required=False, allow_null=True)
|
|
total_surveys_ytd = serializers.IntegerField(required=False)
|
|
best_month = PhysicianMonthlyRatingSerializer(required=False, allow_null=True)
|
|
worst_month = PhysicianMonthlyRatingSerializer(required=False, allow_null=True)
|
|
trend = serializers.CharField(required=False) # 'improving', 'declining', 'stable'
|