106 lines
4.2 KiB
Python
106 lines
4.2 KiB
Python
from django.contrib.auth import get_user_model
|
|
from rest_framework import serializers
|
|
|
|
from .models import BlogPost, Bug, Friendship, Message
|
|
|
|
User = get_user_model()
|
|
|
|
|
|
def _user_mini(user):
|
|
if user is None:
|
|
return None
|
|
name = (f'{user.first_name} {user.last_name}'.strip()) or user.username
|
|
return {'id': user.id, 'username': user.username, 'display_name': name}
|
|
|
|
|
|
# ── Message ───────────────────────────────────────────────────────────────────
|
|
|
|
class MessageListSerializer(serializers.ModelSerializer):
|
|
sender_detail = serializers.SerializerMethodField()
|
|
recipient_detail = serializers.SerializerMethodField()
|
|
|
|
def get_sender_detail(self, obj): return _user_mini(obj.sender)
|
|
def get_recipient_detail(self, obj): return _user_mini(obj.recipient)
|
|
|
|
class Meta:
|
|
model = Message
|
|
fields = ['id', 'sender_detail', 'recipient_detail', 'subject', 'sent_at', 'read_at']
|
|
|
|
|
|
class MessageDetailSerializer(serializers.ModelSerializer):
|
|
sender_detail = serializers.SerializerMethodField()
|
|
recipient_detail = serializers.SerializerMethodField()
|
|
|
|
def get_sender_detail(self, obj): return _user_mini(obj.sender)
|
|
def get_recipient_detail(self, obj): return _user_mini(obj.recipient)
|
|
|
|
class Meta:
|
|
model = Message
|
|
fields = ['id', 'sender_detail', 'recipient_detail', 'subject', 'body', 'sent_at', 'read_at']
|
|
|
|
|
|
class MessageCreateSerializer(serializers.ModelSerializer):
|
|
recipient = serializers.PrimaryKeyRelatedField(queryset=User.objects.all())
|
|
|
|
class Meta:
|
|
model = Message
|
|
fields = ['recipient', 'subject', 'body']
|
|
|
|
def validate_recipient(self, value):
|
|
if value == self.context['request'].user:
|
|
raise serializers.ValidationError('You cannot send a message to yourself.')
|
|
return value
|
|
|
|
|
|
# ── BlogPost ──────────────────────────────────────────────────────────────────
|
|
|
|
class BlogPostSerializer(serializers.ModelSerializer):
|
|
author_detail = serializers.SerializerMethodField()
|
|
|
|
def get_author_detail(self, obj): return _user_mini(obj.author)
|
|
|
|
class Meta:
|
|
model = BlogPost
|
|
fields = ['id', 'author_detail', 'title', 'body', 'is_public', 'created_at', 'updated_at']
|
|
read_only_fields = ['created_at', 'updated_at']
|
|
|
|
|
|
# ── Bug ───────────────────────────────────────────────────────────────────────
|
|
|
|
class BugSerializer(serializers.ModelSerializer):
|
|
reporter_detail = serializers.SerializerMethodField()
|
|
|
|
def get_reporter_detail(self, obj): return _user_mini(obj.reporter)
|
|
|
|
class Meta:
|
|
model = Bug
|
|
fields = [
|
|
'id', 'reporter_detail', 'title', 'description',
|
|
'severity', 'status', 'created_at', 'updated_at', 'resolved_at',
|
|
]
|
|
read_only_fields = ['status', 'resolved_at', 'created_at', 'updated_at']
|
|
|
|
|
|
# ── Friendship ────────────────────────────────────────────────────────────────
|
|
|
|
class FriendshipSerializer(serializers.ModelSerializer):
|
|
from_user_detail = serializers.SerializerMethodField()
|
|
to_user_detail = serializers.SerializerMethodField()
|
|
|
|
def get_from_user_detail(self, obj): return _user_mini(obj.from_user)
|
|
def get_to_user_detail(self, obj): return _user_mini(obj.to_user)
|
|
|
|
class Meta:
|
|
model = Friendship
|
|
fields = ['id', 'from_user_detail', 'to_user_detail', 'status', 'created_at']
|
|
read_only_fields = ['status', 'created_at']
|
|
|
|
|
|
class FriendRequestSerializer(serializers.Serializer):
|
|
to_user = serializers.PrimaryKeyRelatedField(queryset=User.objects.all())
|
|
|
|
def validate_to_user(self, value):
|
|
if value == self.context['request'].user:
|
|
raise serializers.ValidationError('You cannot send a friend request to yourself.')
|
|
return value
|