191 lines
6.6 KiB
Python
191 lines
6.6 KiB
Python
import os
|
|
|
|
from django.utils.text import slugify
|
|
from rest_framework import serializers
|
|
|
|
from users.models import User
|
|
from .models import (
|
|
UploadedImage,
|
|
Category,
|
|
Post,
|
|
Comment,
|
|
Page,
|
|
Tag,
|
|
)
|
|
|
|
# Serialized do tagów
|
|
class TagSerializer(serializers.ModelSerializer):
|
|
class Meta:
|
|
model = Tag
|
|
fields = ['id', 'name', 'slug']
|
|
read_only_fields = ['id']
|
|
|
|
# Serialized do kategorii
|
|
class CategorySerializer(serializers.ModelSerializer):
|
|
class Meta:
|
|
model = Category
|
|
fields = ['id', 'name', 'slug', 'description', 'parent_category', 'created_at']
|
|
read_only_fields = ['id', 'created_at']
|
|
|
|
# Serialized do użytkowników
|
|
class UserSerializer(serializers.ModelSerializer):
|
|
class Meta:
|
|
model = User
|
|
fields = ['id', 'username', 'first_name', 'last_name']
|
|
read_only_fields = ['id']
|
|
|
|
# Serialized do komentarzy
|
|
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']
|
|
|
|
# Serialized do postów
|
|
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)
|
|
|
|
meta_title = serializers.CharField(required=False, allow_blank=True)
|
|
meta_description = serializers.CharField(required=False, allow_blank=True)
|
|
meta_image = serializers.CharField(required=False, allow_null=True)
|
|
|
|
class Meta:
|
|
model = Post
|
|
fields = [
|
|
'id', 'title', 'content', 'status', 'author',
|
|
'category', 'category_id', 'comments',
|
|
'created_at', 'updated_at', 'tags', 'tag_ids', 'slug',
|
|
'meta_title', 'meta_description', 'meta_image',]
|
|
read_only_fields = ['id', 'created_at', 'updated_at', 'author', 'slug']
|
|
lookup_field = 'slug'
|
|
extra_kwargs = {
|
|
'url': {'lookup_field': 'slug'}
|
|
}
|
|
|
|
def create(self, validated_data):
|
|
if not validated_data.get('slug'):
|
|
validated_data['slug'] = slugify(validated_data.get('title', ''))
|
|
return super().create(validated_data)
|
|
|
|
def update(self, instance, validated_data):
|
|
if not validated_data.get('slug') and validated_data.get('title'):
|
|
validated_data['slug'] = slugify(validated_data['title'])
|
|
return super().update(instance, validated_data)
|
|
|
|
# Serialized do stron
|
|
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)
|
|
|
|
meta_title = serializers.CharField(required=False, allow_blank=True)
|
|
meta_description = serializers.CharField(required=False, allow_blank=True)
|
|
meta_image = serializers.ImageField(required=False, allow_null=True)
|
|
|
|
class Meta:
|
|
model = Page
|
|
fields = [
|
|
'id', 'title', 'content', 'status', 'author',
|
|
'category', 'category_id', 'comments',
|
|
'created_at', 'updated_at', 'slug',
|
|
'meta_title', 'meta_description', 'meta_image']
|
|
read_only_fields = ['id', 'created_at', 'updated_at', 'author', 'slug']
|
|
lookup_field = 'slug'
|
|
extra_kwargs = {
|
|
'url': {'lookup_field': 'slug'}
|
|
}
|
|
|
|
# Serialized do przesłanych obrazów
|
|
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',
|
|
'category',
|
|
'description',
|
|
]
|
|
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):
|
|
print(f"Rozmiar pliku: {obj.file_size}")
|
|
size = obj.file_size
|
|
if size is None:
|
|
return "0 B" # albo return None
|
|
|
|
for unit in ['B', 'KB', 'MB', 'GB']:
|
|
if size < 1024.0:
|
|
return f"{size:.1f} {unit}"
|
|
size /= 1024.0
|
|
return f"{size:.1f} TB"
|
|
|
|
def validate_image(self, value):
|
|
if not value:
|
|
raise serializers.ValidationError("Image file is required.")
|
|
return value
|
|
url = serializers.SerializerMethodField()
|
|
file_size_display = serializers.SerializerMethodField()
|
|
image = serializers.ImageField(required=True)
|
|
|
|
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
|
|
|
|
def validate_category(self, value):
|
|
if not Category.objects.filter(id=value.id if isinstance(value, Category) else value).exists():
|
|
raise serializers.ValidationError("Wybrana kategoria nie istnieje.")
|
|
return value |