from rest_framework import viewsets, permissions, filters from rest_framework.decorators import action from rest_framework.response import Response from django_filters.rest_framework import DjangoFilterBackend from .models import Product, Review, Category, CustomOrder from .serializers import ( ProductSerializer, ReviewSerializer, CategorySerializer, CustomOrderSerializer ) class ProductViewSet(viewsets.ReadOnlyModelViewSet): queryset = Product.objects.all().select_related('category').prefetch_related('reviews') serializer_class = ProductSerializer permission_classes = [permissions.IsAuthenticatedOrReadOnly] filter_backends = [DjangoFilterBackend, filters.SearchFilter, filters.OrderingFilter] filterset_fields = ['fursuit_type', 'style', 'category', 'is_featured', 'is_custom_order'] search_fields = ['name', 'description', 'category__name'] ordering_fields = ['price', 'created', 'name', 'average_rating'] ordering = ['-created'] @action(detail=True, methods=['post']) def add_to_wishlist(self, request, pk=None): product = self.get_object() user = request.user if user.is_authenticated: product.wishlist_users.add(user) return Response({'status': 'added to wishlist'}) return Response({'error': 'user not authenticated'}, status=401) @action(detail=True, methods=['post']) def add_review(self, request, pk=None): product = self.get_object() serializer = ReviewSerializer(data=request.data) if serializer.is_valid(): serializer.save(product=product, user=request.user) return Response(serializer.data, status=201) return Response(serializer.errors, status=400) class CategoryViewSet(viewsets.ReadOnlyModelViewSet): queryset = Category.objects.all() serializer_class = CategorySerializer permission_classes = [permissions.IsAuthenticatedOrReadOnly] class ReviewViewSet(viewsets.ModelViewSet): queryset = Review.objects.all().select_related('product', 'user') serializer_class = ReviewSerializer permission_classes = [permissions.IsAuthenticatedOrReadOnly] filter_backends = [DjangoFilterBackend] filterset_fields = ['product', 'rating'] def perform_create(self, serializer): serializer.save(user=self.request.user) class CustomOrderViewSet(viewsets.ModelViewSet): serializer_class = CustomOrderSerializer permission_classes = [permissions.IsAuthenticated] def get_queryset(self): return CustomOrder.objects.filter(user=self.request.user) def perform_create(self, serializer): serializer.save(user=self.request.user)