62 lines
2.6 KiB
Python
62 lines
2.6 KiB
Python
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) |