You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 

94 lines
3.4 KiB

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)