430 lines
17 KiB
Python
430 lines
17 KiB
Python
<<<<<<< HEAD
|
|
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'
|
|
]
|
|
=======
|
|
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'
|
|
]
|
|
>>>>>>> 5b9b867963eca600ed64b617dc2dc86c30dbd9cb
|
|
read_only_fields = ['id', 'created_at'] |