<<<<<<< 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']