89 lines
3.0 KiB
Python
89 lines
3.0 KiB
Python
from rest_framework import serializers
|
|
from .models import Message, SystemMessage, SystemMessageRead
|
|
|
|
|
|
class MessageListSerializer(serializers.ModelSerializer):
|
|
sender_name = serializers.SerializerMethodField()
|
|
sender_avatar = serializers.SerializerMethodField()
|
|
time = serializers.SerializerMethodField()
|
|
is_comment = serializers.SerializerMethodField()
|
|
comment_id = serializers.SerializerMethodField()
|
|
article_id = serializers.SerializerMethodField()
|
|
type = serializers.CharField(source='msg_type', read_only=True)
|
|
extra = serializers.CharField(source='extra_info', read_only=True)
|
|
link = serializers.CharField(source='target_link', read_only=True)
|
|
|
|
class Meta:
|
|
model = Message
|
|
fields = [
|
|
'id', 'type', 'title', 'content', 'time', 'is_read',
|
|
'sender_name', 'sender_avatar', 'extra', 'link',
|
|
'is_comment', 'comment_id', 'article_id',
|
|
]
|
|
|
|
def get_sender_name(self, obj):
|
|
if obj.sender:
|
|
return obj.sender.nickname or obj.sender.username
|
|
return '系统'
|
|
|
|
def get_sender_avatar(self, obj):
|
|
if obj.sender and obj.sender.avatar:
|
|
request = self.context.get('request')
|
|
if request:
|
|
return request.build_absolute_uri(obj.sender.avatar.url)
|
|
return obj.sender.avatar.url
|
|
return ''
|
|
|
|
def get_time(self, obj):
|
|
return obj.created_at.strftime('%Y-%m-%d %H:%M')
|
|
|
|
def get_is_comment(self, obj):
|
|
return obj.target_type == 'comment'
|
|
|
|
def get_comment_id(self, obj):
|
|
if obj.target_type == 'comment' and obj.target_id:
|
|
return str(obj.target_id)
|
|
return ''
|
|
|
|
def get_article_id(self, obj):
|
|
if obj.target_link:
|
|
import re
|
|
match = re.search(r'/article/(\d+)', obj.target_link)
|
|
if match:
|
|
return match.group(1)
|
|
if obj.extra_info:
|
|
import re
|
|
match = re.search(r'/article/(\d+)', obj.extra_info)
|
|
if match:
|
|
return match.group(1)
|
|
return None
|
|
|
|
|
|
class SystemMessageSerializer(serializers.ModelSerializer):
|
|
is_read = serializers.SerializerMethodField()
|
|
|
|
class Meta:
|
|
model = SystemMessage
|
|
fields = ['id', 'title', 'content', 'category', 'icon_name', 'icon_color', 'created_at', 'is_read']
|
|
|
|
def get_is_read(self, obj):
|
|
read_ids = self.context.get('read_ids', set())
|
|
return obj.id in read_ids
|
|
|
|
|
|
class SystemMessageDetailSerializer(serializers.ModelSerializer):
|
|
is_read = serializers.SerializerMethodField()
|
|
|
|
class Meta:
|
|
model = SystemMessage
|
|
fields = ['id', 'title', 'content', 'detail', 'category', 'icon_name', 'icon_color', 'created_at', 'is_read']
|
|
|
|
def get_is_read(self, obj):
|
|
request = self.context.get('request')
|
|
if request and request.user.is_authenticated:
|
|
return SystemMessageRead.objects.filter(
|
|
user=request.user,
|
|
system_message=obj
|
|
).exists()
|
|
return False
|