from rest_framework import serializers from apps.tickets.models import ( Ticket, TicketMessage, TicketCategory, TicketPriority, TicketStatus, ) class TicketMessageSerializer(serializers.ModelSerializer): sender_name = serializers.CharField(source='sender.get_full_name', read_only=True) sender_id = serializers.IntegerField(source='sender.id', read_only=True) class Meta: model = TicketMessage fields = [ 'id', 'sender_id', 'sender_name', 'is_official_response', 'department_label', 'content', 'attachment', 'created_at', ] read_only_fields = ['id', 'sender_id', 'sender_name', 'is_official_response', 'created_at'] class TicketMessageCreateSerializer(serializers.ModelSerializer): class Meta: model = TicketMessage fields = ['content', 'attachment', 'department_label'] class TicketListSerializer(serializers.ModelSerializer): submitter_name = serializers.CharField(source='user.get_full_name', read_only=True) institution_name = serializers.CharField(source='institution.name', read_only=True) messages_count = serializers.IntegerField(source='messages.count', read_only=True) class Meta: model = Ticket fields = [ 'id', 'tracking_code', 'subject', 'category', 'priority', 'status', 'submitter_name', 'institution', 'institution_name', 'messages_count', 'satisfaction_rating', 'created_at', 'updated_at', 'closed_at', ] class TicketDetailSerializer(serializers.ModelSerializer): submitter_name = serializers.CharField(source='user.get_full_name', read_only=True) institution_name = serializers.CharField(source='institution.name', read_only=True) expert_name = serializers.CharField(source='assigned_expert.get_full_name', read_only=True) messages = TicketMessageSerializer(many=True, read_only=True) class Meta: model = Ticket fields = [ 'id', 'tracking_code', 'subject', 'category', 'priority', 'status', 'submitter_name', 'institution', 'institution_name', 'assigned_expert', 'expert_name', 'satisfaction_rating', 'feedback_comment', 'messages', 'created_at', 'updated_at', 'closed_at', ] class TicketCreateSerializer(serializers.ModelSerializer): content = serializers.CharField(write_only=True, required=True, help_text="Initial message description") attachment = serializers.FileField(write_only=True, required=False, allow_null=True) class Meta: model = Ticket fields = [ 'id', 'tracking_code', 'subject', 'category', 'priority', 'institution', 'content', 'attachment', ] read_only_fields = ['id', 'tracking_code'] def create(self, validated_data): content = validated_data.pop('content') attachment = validated_data.pop('attachment', None) user = self.context['request'].user ticket = Ticket.objects.create(user=user, **validated_data) TicketMessage.objects.create( ticket=ticket, sender=user, content=content, attachment=attachment, is_official_response=False, ) return ticket class TicketRateSerializer(serializers.Serializer): rating = serializers.IntegerField(min_value=1, max_value=5, help_text="1 to 5 stars") feedback = serializers.CharField(required=False, allow_blank=True)