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
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)
|