97 lines
No EOL
3.2 KiB
Python
97 lines
No EOL
3.2 KiB
Python
from django.utils.decorators import method_decorator
|
|
from django.views.decorators.csrf import csrf_exempt
|
|
from rest_framework import viewsets, permissions
|
|
from rest_framework.decorators import action
|
|
from rest_framework.response import Response
|
|
from .models import Cart, CartItem
|
|
from .serializers import CartSerializer
|
|
|
|
|
|
def get_or_create_cart(request):
|
|
"""Получить или создать корзину по сессии"""
|
|
if not request.session.session_key:
|
|
request.session.create()
|
|
|
|
session_key = request.session.session_key
|
|
cart = Cart.objects.filter(session_key=session_key).first()
|
|
|
|
if not cart:
|
|
cart = Cart.objects.create(
|
|
session_key=session_key,
|
|
user=request.user if request.user.is_authenticated else None
|
|
)
|
|
|
|
return cart
|
|
|
|
|
|
@method_decorator(csrf_exempt, name='dispatch')
|
|
class CartViewSet(viewsets.ModelViewSet):
|
|
serializer_class = CartSerializer
|
|
|
|
# ВАЖНО: Отключаем аутентификацию для этого ViewSet,
|
|
# чтобы DRF не требовал CSRF-токен для POST-запросов
|
|
authentication_classes = []
|
|
permission_classes = [permissions.AllowAny]
|
|
|
|
def get_queryset(self):
|
|
if self.request.user.is_authenticated:
|
|
return Cart.objects.filter(user=self.request.user)
|
|
return Cart.objects.none()
|
|
|
|
@action(detail=False, methods=['get'])
|
|
def my_cart(self, request):
|
|
cart = get_or_create_cart(request)
|
|
serializer = self.get_serializer(cart)
|
|
return Response(serializer.data)
|
|
|
|
@action(detail=False, methods=['post'])
|
|
def add_item(self, request):
|
|
cart = get_or_create_cart(request)
|
|
|
|
product_id = request.data.get('product_id')
|
|
quantity = request.data.get('quantity', 1)
|
|
size = request.data.get('size', '')
|
|
color = request.data.get('color', '')
|
|
|
|
cart_item, created = CartItem.objects.get_or_create(
|
|
cart=cart,
|
|
product_id=product_id,
|
|
size=size,
|
|
color=color,
|
|
defaults={'quantity': quantity}
|
|
)
|
|
|
|
if not created:
|
|
cart_item.quantity += quantity
|
|
cart_item.save()
|
|
|
|
serializer = self.get_serializer(cart)
|
|
return Response(serializer.data)
|
|
|
|
@action(detail=False, methods=['post'])
|
|
def update_item(self, request):
|
|
cart = get_or_create_cart(request)
|
|
|
|
item_id = request.data.get('item_id')
|
|
quantity = request.data.get('quantity')
|
|
|
|
try:
|
|
cart_item = CartItem.objects.get(cart=cart, id=item_id)
|
|
cart_item.quantity = quantity
|
|
cart_item.save()
|
|
except CartItem.DoesNotExist:
|
|
return Response({'error': 'Item not found'}, status=404)
|
|
|
|
serializer = self.get_serializer(cart)
|
|
return Response(serializer.data)
|
|
|
|
@action(detail=False, methods=['post'])
|
|
def remove_item(self, request):
|
|
cart = get_or_create_cart(request)
|
|
|
|
item_id = request.data.get('item_id')
|
|
|
|
CartItem.objects.filter(cart=cart, id=item_id).delete()
|
|
|
|
serializer = self.get_serializer(cart)
|
|
return Response(serializer.data) |