Files
GNX-WEB/backEnd/blog/serializers.py
Iliyan Angelov 366f28677a update
2025-11-24 03:52:08 +02:00

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']