116 lines
3.9 KiB
Python
116 lines
3.9 KiB
Python
from rest_framework import serializers
|
|
from .models import Post, Comment, Page, Category, UploadedImage, Tag
|
|
from users.models import User
|
|
|
|
class TagSerializer(serializers.ModelSerializer):
|
|
class Meta:
|
|
model = Tag
|
|
fields = ['id', 'name', 'slug']
|
|
read_only_fields = ['id']
|
|
|
|
class CategorySerializer(serializers.ModelSerializer):
|
|
class Meta:
|
|
model = Category
|
|
fields = ['id', 'name', 'slug']
|
|
read_only_fields = ['id']
|
|
|
|
class UserSerializer(serializers.ModelSerializer):
|
|
class Meta:
|
|
model = User
|
|
fields = ['id', 'username', 'first_name', 'last_name']
|
|
read_only_fields = ['id']
|
|
|
|
class CommentSerializer(serializers.ModelSerializer):
|
|
author = UserSerializer(read_only=True)
|
|
|
|
class Meta:
|
|
model = Comment
|
|
fields = ['id', 'content', 'author', 'post', 'page', 'approved', 'created_at']
|
|
read_only_fields = ['id', 'created_at', 'author']
|
|
|
|
class PostSerializer(serializers.ModelSerializer):
|
|
author = UserSerializer(read_only=True)
|
|
category = CategorySerializer(read_only=True)
|
|
category_id = serializers.PrimaryKeyRelatedField(
|
|
queryset=Category.objects.all(),
|
|
source='category',
|
|
write_only=True
|
|
)
|
|
comments = CommentSerializer(many=True, read_only=True)
|
|
tags = TagSerializer(many=True, read_only=True)
|
|
tag_ids = serializers.PrimaryKeyRelatedField(
|
|
queryset=Tag.objects.all(),
|
|
source='tags',
|
|
many=True,
|
|
write_only=True,
|
|
required=False
|
|
)
|
|
slug = serializers.SlugField(required=True)
|
|
|
|
class Meta:
|
|
model = Post
|
|
fields = [
|
|
'id', 'title', 'content', 'status', 'author',
|
|
'category', 'category_id', 'comments',
|
|
'created_at', 'updated_at', 'tags', 'tag_ids', 'slug'
|
|
]
|
|
read_only_fields = ['id', 'created_at', 'updated_at', 'author', 'slug']
|
|
lookup_field = 'slug'
|
|
extra_kwargs = {
|
|
'url': {'lookup_field': 'slug'}
|
|
}
|
|
|
|
class PageSerializer(serializers.ModelSerializer):
|
|
author = UserSerializer(read_only=True)
|
|
category = CategorySerializer(read_only=True)
|
|
category_id = serializers.PrimaryKeyRelatedField(
|
|
queryset=Category.objects.all(),
|
|
source='category',
|
|
write_only=True
|
|
)
|
|
comments = CommentSerializer(many=True, read_only=True)
|
|
slug = serializers.SlugField(required=True)
|
|
class Meta:
|
|
model = Page
|
|
fields = [
|
|
'id', 'title', 'content', 'status', 'author',
|
|
'category', 'category_id', 'comments',
|
|
'created_at', 'updated_at', 'slug'
|
|
]
|
|
read_only_fields = ['id', 'created_at', 'updated_at', 'author', 'slug']
|
|
lookup_field = 'slug'
|
|
extra_kwargs = {
|
|
'url': {'lookup_field': 'slug'}
|
|
}
|
|
|
|
class UploadedImageSerializer(serializers.ModelSerializer):
|
|
url = serializers.SerializerMethodField()
|
|
file_size_display = serializers.SerializerMethodField()
|
|
image = serializers.ImageField(required=True)
|
|
|
|
class Meta:
|
|
model = UploadedImage
|
|
fields = ['id', 'title', 'image', 'url', 'uploaded_at', 'file_size', 'file_size_display']
|
|
read_only_fields = ['file_size', 'uploaded_at', 'url']
|
|
|
|
def get_url(self, obj):
|
|
request = self.context.get('request')
|
|
if obj.image and hasattr(obj.image, 'url'):
|
|
return request.build_absolute_uri(obj.image.url) if request else obj.image.url
|
|
return None
|
|
|
|
def get_file_size_display(self, obj):
|
|
"""Convert bytes to human readable format"""
|
|
for unit in ['B', 'KB', 'MB', 'GB']:
|
|
if obj.file_size < 1024.0:
|
|
return f"{obj.file_size:.1f} {unit}"
|
|
obj.file_size /= 1024.0
|
|
return f"{obj.file_size:.1f} TB"
|
|
|
|
def validate_image(self, value):
|
|
if not value:
|
|
raise serializers.ValidationError("Image file is required.")
|
|
return value
|
|
|
|
|