furry/products/serializers.py

214 lines
8.5 KiB
Python

from rest_framework import serializers
from .models import Product, Category, Review, Wishlist, GalleryImage, CustomOrder, Payment
from django.contrib.auth.models import User
class UserSerializer(serializers.ModelSerializer):
"""Serializer für User-Model"""
class Meta:
model = User
fields = ['id', 'username', 'email', 'first_name', 'last_name']
read_only_fields = ['id']
class CategorySerializer(serializers.ModelSerializer):
"""Serializer für Category-Model"""
product_count = serializers.SerializerMethodField()
class Meta:
model = Category
fields = ['id', 'name', 'slug', 'description', 'image', 'product_count']
def get_product_count(self, obj):
return obj.products.count()
class ReviewSerializer(serializers.ModelSerializer):
"""Serializer für Review-Model"""
user = UserSerializer(read_only=True)
user_name = serializers.CharField(source='user.username', read_only=True)
class Meta:
model = Review
fields = ['id', 'product', 'user', 'user_name', 'rating', 'comment', 'created_at']
read_only_fields = ['id', 'created_at']
def create(self, validated_data):
validated_data['user'] = self.context['request'].user
return super().create(validated_data)
class GalleryImageSerializer(serializers.ModelSerializer):
"""Serializer für GalleryImage-Model"""
class Meta:
model = GalleryImage
fields = ['id', 'product', 'image', 'alt_text', 'is_featured', 'created_at']
read_only_fields = ['id', 'created_at']
class ProductSerializer(serializers.ModelSerializer):
"""Basis-Serializer für Product-Model"""
category = CategorySerializer(read_only=True)
category_id = serializers.IntegerField(write_only=True, required=False)
reviews = ReviewSerializer(many=True, read_only=True)
gallery_images = GalleryImageSerializer(many=True, read_only=True)
average_rating = serializers.FloatField(read_only=True)
review_count = serializers.IntegerField(read_only=True)
is_in_wishlist = serializers.SerializerMethodField()
class Meta:
model = Product
fields = [
'id', 'name', 'slug', 'description', 'base_price', 'sale_price',
'on_sale', 'stock', 'product_type', 'fursuit_type', 'style',
'is_custom_order', 'is_featured', 'category', 'category_id',
'image', 'gallery_images', 'reviews', 'average_rating',
'review_count', 'is_in_wishlist', 'created_at', 'updated_at'
]
read_only_fields = ['id', 'slug', 'created_at', 'updated_at']
def get_is_in_wishlist(self, obj):
user = self.context['request'].user
if user.is_authenticated:
return obj.wishlists.filter(user=user).exists()
return False
def create(self, validated_data):
category_id = validated_data.pop('category_id', None)
if category_id:
validated_data['category'] = Category.objects.get(id=category_id)
return super().create(validated_data)
class ProductListSerializer(serializers.ModelSerializer):
"""Vereinfachter Serializer für Produktlisten"""
category = CategorySerializer(read_only=True)
average_rating = serializers.FloatField(read_only=True)
review_count = serializers.IntegerField(read_only=True)
is_in_wishlist = serializers.SerializerMethodField()
class Meta:
model = Product
fields = [
'id', 'name', 'slug', 'description', 'base_price', 'sale_price',
'on_sale', 'stock', 'product_type', 'fursuit_type', 'style',
'is_custom_order', 'is_featured', 'category', 'image',
'average_rating', 'review_count', 'is_in_wishlist'
]
def get_is_in_wishlist(self, obj):
user = self.context['request'].user
if user.is_authenticated:
return obj.wishlists.filter(user=user).exists()
return False
class ProductDetailSerializer(ProductSerializer):
"""Detaillierter Serializer für Produktdetails"""
related_products = ProductListSerializer(many=True, read_only=True)
class Meta(ProductSerializer.Meta):
fields = ProductSerializer.Meta.fields + ['related_products']
class WishlistSerializer(serializers.ModelSerializer):
"""Serializer für Wishlist-Model"""
products = ProductListSerializer(many=True, read_only=True)
product_count = serializers.SerializerMethodField()
class Meta:
model = Wishlist
fields = ['id', 'user', 'products', 'product_count', 'created_at']
read_only_fields = ['id', 'created_at']
def get_product_count(self, obj):
return obj.products.count()
class CustomOrderSerializer(serializers.ModelSerializer):
"""Serializer für CustomOrder-Model"""
user = UserSerializer(read_only=True)
status_display = serializers.CharField(source='get_status_display', read_only=True)
class Meta:
model = CustomOrder
fields = [
'id', 'user', 'title', 'description', 'fursuit_type', 'style',
'size', 'color_preferences', 'special_requirements', 'budget',
'status', 'status_display', 'created_at', 'updated_at'
]
read_only_fields = ['id', 'created_at', 'updated_at']
def create(self, validated_data):
validated_data['user'] = self.context['request'].user
return super().create(validated_data)
class PaymentSerializer(serializers.ModelSerializer):
"""Serializer für Payment-Model"""
user = UserSerializer(read_only=True)
status_display = serializers.CharField(source='get_status_display', read_only=True)
class Meta:
model = Payment
fields = [
'id', 'user', 'order', 'amount', 'payment_method', 'status',
'status_display', 'transaction_id', 'created_at'
]
read_only_fields = ['id', 'created_at']
class CartItemSerializer(serializers.Serializer):
"""Serializer für Warenkorb-Items"""
product_id = serializers.IntegerField()
quantity = serializers.IntegerField(min_value=1)
product = ProductListSerializer(read_only=True)
total_price = serializers.DecimalField(max_digits=10, decimal_places=2, read_only=True)
class CartSerializer(serializers.Serializer):
"""Serializer für Warenkorb"""
items = CartItemSerializer(many=True)
subtotal = serializers.DecimalField(max_digits=10, decimal_places=2)
shipping_cost = serializers.DecimalField(max_digits=10, decimal_places=2)
total = serializers.DecimalField(max_digits=10, decimal_places=2)
item_count = serializers.IntegerField()
class SearchFilterSerializer(serializers.Serializer):
"""Serializer für Such- und Filter-Parameter"""
query = serializers.CharField(required=False, allow_blank=True)
category = serializers.CharField(required=False, allow_blank=True)
fursuit_type = serializers.CharField(required=False, allow_blank=True)
style = serializers.CharField(required=False, allow_blank=True)
min_price = serializers.DecimalField(max_digits=10, decimal_places=2, required=False)
max_price = serializers.DecimalField(max_digits=10, decimal_places=2, required=False)
on_sale = serializers.BooleanField(required=False)
is_featured = serializers.BooleanField(required=False)
sort_by = serializers.CharField(required=False, default='newest')
page = serializers.IntegerField(required=False, default=1)
page_size = serializers.IntegerField(required=False, default=12)
class ProductStatsSerializer(serializers.Serializer):
"""Serializer für Produkt-Statistiken"""
total_products = serializers.IntegerField()
featured_products = serializers.IntegerField()
on_sale_products = serializers.IntegerField()
low_stock_products = serializers.IntegerField()
categories_count = serializers.IntegerField()
average_rating = serializers.FloatField()
total_reviews = serializers.IntegerField()
class GalleryImageDetailSerializer(serializers.ModelSerializer):
"""Detaillierter Serializer für Galerie-Bilder"""
product = ProductListSerializer(read_only=True)
class Meta:
model = GalleryImage
fields = [
'id', 'product', 'image', 'alt_text', 'title', 'description',
'is_featured', 'fursuit_type', 'style', 'created_at'
]
read_only_fields = ['id', 'created_at']