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