92 lines
3.5 KiB
Python
92 lines
3.5 KiB
Python
from rest_framework import serializers
|
|
from .models import Ticket, Message, Attachment
|
|
from django.utils.timezone import localtime
|
|
from account.serializers import ProfileSerializer
|
|
from order.serializers import OrderSerializer
|
|
from order.serializers import OrderModel
|
|
|
|
class AttachmentSerializer(serializers.ModelSerializer):
|
|
file = serializers.FileField(write_only=True)
|
|
link = serializers.SerializerMethodField()
|
|
|
|
class Meta:
|
|
model = Attachment
|
|
fields = ['id', 'name', 'file', 'link' , 'created_at', 'size']
|
|
read_only_fields = ('size', 'name', )
|
|
|
|
def get_link(self, obj):
|
|
request = self.context.get('request')
|
|
if request is not None:
|
|
return request.build_absolute_uri(obj.file.url)
|
|
return obj.file.url
|
|
|
|
class MessageSerializer(serializers.ModelSerializer):
|
|
is_user = serializers.SerializerMethodField(read_only=True)
|
|
class Meta:
|
|
model = Message
|
|
exclude = ('sender', )
|
|
extra_kwargs = {'ticket': {'write_only': True}}
|
|
def get_is_user(self, obj):
|
|
user = self.context['request'].user
|
|
return user == obj.sender
|
|
|
|
class MessageAttachmentSerializer(serializers.ModelSerializer):
|
|
is_user = serializers.SerializerMethodField(read_only=True)
|
|
attachments = AttachmentSerializer(many=True, read_only=True)
|
|
class Meta:
|
|
model = Message
|
|
exclude = ('sender', )
|
|
extra_kwargs = {'ticket': {'write_only': True}}
|
|
def get_is_user(self, obj):
|
|
user = self.context['request'].user
|
|
return user == obj.sender
|
|
|
|
class MessageForTicketSerializer(serializers.ModelSerializer):
|
|
class Meta:
|
|
model = Message
|
|
exclude = ('sender', 'ticket')
|
|
class TicketSerializer(serializers.ModelSerializer):
|
|
status = serializers.SerializerMethodField()
|
|
ticket_category = serializers.SerializerMethodField()
|
|
messages = MessageAttachmentSerializer(many=True, read_only=True)
|
|
message = MessageForTicketSerializer(write_only=True)
|
|
order_id = serializers.PrimaryKeyRelatedField(queryset=OrderModel.objects.all(), write_only=True, source='order')
|
|
order = OrderSerializer(read_only=True)
|
|
class Meta:
|
|
model = Ticket
|
|
exclude = ('customer', 'admin')
|
|
read_only_fields = ('status',)
|
|
|
|
def create(self, validated_data):
|
|
message = validated_data.pop('message', None)
|
|
ticket = super().create(validated_data)
|
|
if message:
|
|
message['ticket'] = ticket.pk
|
|
if 'attachments' in message:
|
|
message['attachments'] = [attachment.pk for attachment in message['attachments']]
|
|
message_obj = MessageSerializer(data=message)
|
|
if message_obj.is_valid():
|
|
message_obj.save(sender=ticket.customer)
|
|
else:
|
|
raise Exception(f'error in create failed: {message_obj.errors}')
|
|
return ticket
|
|
|
|
def get_status(self, obj):
|
|
return obj.get_status_display()
|
|
|
|
def get_ticket_category(self, obj):
|
|
return obj.get_ticket_category_display()
|
|
|
|
class TicketListSerializer(serializers.ModelSerializer):
|
|
status = serializers.SerializerMethodField()
|
|
ticket_category = serializers.SerializerMethodField()
|
|
order = OrderSerializer()
|
|
class Meta:
|
|
model = Ticket
|
|
exclude = ('customer', 'admin', )
|
|
read_only_fields = ('status',)
|
|
def get_status(self, obj):
|
|
return obj.get_status_display()
|
|
|
|
def get_ticket_category(self, obj):
|
|
return obj.get_ticket_category_display() |