furry/products/api.py

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)