114 lines
3.9 KiB
Python
114 lines
3.9 KiB
Python
from rest_framework import serializers
|
|
from .models import BlogPost, BlogCategory, BlogAuthor, BlogTag, BlogComment
|
|
|
|
|
|
class BlogAuthorSerializer(serializers.ModelSerializer):
|
|
"""Serializer for blog authors"""
|
|
class Meta:
|
|
model = BlogAuthor
|
|
fields = ['id', 'name', 'email', 'bio', 'avatar']
|
|
|
|
|
|
class BlogCategorySerializer(serializers.ModelSerializer):
|
|
"""Serializer for blog categories"""
|
|
posts_count = serializers.SerializerMethodField()
|
|
|
|
class Meta:
|
|
model = BlogCategory
|
|
fields = ['id', 'title', 'slug', 'description', 'display_order', 'posts_count']
|
|
|
|
def get_posts_count(self, obj):
|
|
return obj.posts.filter(published=True).count()
|
|
|
|
|
|
class BlogTagSerializer(serializers.ModelSerializer):
|
|
"""Serializer for blog tags"""
|
|
class Meta:
|
|
model = BlogTag
|
|
fields = ['id', 'name', 'slug']
|
|
|
|
|
|
class BlogPostListSerializer(serializers.ModelSerializer):
|
|
"""Serializer for blog post list view"""
|
|
author_name = serializers.CharField(source='author.name', read_only=True)
|
|
category_title = serializers.CharField(source='category.title', read_only=True)
|
|
category_slug = serializers.CharField(source='category.slug', read_only=True)
|
|
thumbnail = serializers.SerializerMethodField()
|
|
tags = BlogTagSerializer(many=True, read_only=True)
|
|
|
|
class Meta:
|
|
model = BlogPost
|
|
fields = [
|
|
'id', 'title', 'slug', 'excerpt', 'thumbnail',
|
|
'author_name', 'category_title', 'category_slug',
|
|
'tags', 'published_at', 'created_at', 'updated_at',
|
|
'views_count', 'reading_time', 'featured', 'published'
|
|
]
|
|
|
|
def get_thumbnail(self, obj):
|
|
return obj.get_thumbnail_url
|
|
|
|
|
|
class BlogPostDetailSerializer(serializers.ModelSerializer):
|
|
"""Serializer for blog post detail view"""
|
|
author = BlogAuthorSerializer(read_only=True)
|
|
category = BlogCategorySerializer(read_only=True)
|
|
tags = BlogTagSerializer(many=True, read_only=True)
|
|
thumbnail = serializers.SerializerMethodField()
|
|
featured_image = serializers.SerializerMethodField()
|
|
related_posts = serializers.SerializerMethodField()
|
|
|
|
class Meta:
|
|
model = BlogPost
|
|
fields = [
|
|
'id', 'title', 'slug', 'content', 'excerpt',
|
|
'thumbnail', 'featured_image', 'author', 'category', 'tags',
|
|
'meta_description', 'meta_keywords',
|
|
'published', 'featured', 'views_count', 'reading_time',
|
|
'published_at', 'created_at', 'updated_at', 'related_posts'
|
|
]
|
|
|
|
def get_thumbnail(self, obj):
|
|
return obj.get_thumbnail_url
|
|
|
|
def get_featured_image(self, obj):
|
|
return obj.get_featured_image_url
|
|
|
|
def get_related_posts(self, obj):
|
|
"""Get related posts from the same category"""
|
|
related = BlogPost.objects.filter(
|
|
category=obj.category,
|
|
published=True
|
|
).exclude(id=obj.id)[:3]
|
|
return BlogPostListSerializer(related, many=True, context=self.context).data
|
|
|
|
|
|
class BlogCommentSerializer(serializers.ModelSerializer):
|
|
"""Serializer for blog comments"""
|
|
replies = serializers.SerializerMethodField()
|
|
|
|
class Meta:
|
|
model = BlogComment
|
|
fields = [
|
|
'id', 'post', 'name', 'email', 'content',
|
|
'parent', 'is_approved', 'created_at', 'updated_at', 'replies'
|
|
]
|
|
read_only_fields = ['is_approved', 'created_at', 'updated_at']
|
|
|
|
def get_replies(self, obj):
|
|
"""Get nested replies"""
|
|
if obj.replies.exists():
|
|
return BlogCommentSerializer(
|
|
obj.replies.filter(is_approved=True),
|
|
many=True
|
|
).data
|
|
return []
|
|
|
|
|
|
class BlogCommentCreateSerializer(serializers.ModelSerializer):
|
|
"""Serializer for creating blog comments"""
|
|
class Meta:
|
|
model = BlogComment
|
|
fields = ['post', 'name', 'email', 'content', 'parent']
|
|
|