All checks were successful
Deploy Beta (NATIVE) / deploy (push) Successful in 31s
159 lines
5.4 KiB
Python
159 lines
5.4 KiB
Python
from rest_framework import status, permissions
|
|
from rest_framework.response import Response
|
|
from rest_framework.views import APIView
|
|
from .models import Cart, CartItem, Order, OrderItem
|
|
from .serializers import CartSerializer, OrderSerializer
|
|
from products.models import Product
|
|
import uuid
|
|
|
|
class CartView(APIView):
|
|
permission_classes = [permissions.IsAuthenticated]
|
|
|
|
def get_cart(self, user):
|
|
cart, created = Cart.objects.get_or_create(user=user)
|
|
return cart
|
|
|
|
def get(self, request):
|
|
cart = self.get_cart(request.user)
|
|
serializer = CartSerializer(cart)
|
|
return Response(serializer.data)
|
|
|
|
def post(self, request):
|
|
cart = self.get_cart(request.user)
|
|
product_id = request.data.get('product_id')
|
|
quantity = int(request.data.get('quantity', 1))
|
|
|
|
try:
|
|
product = Product.objects.get(id=product_id, is_active=True)
|
|
except Product.DoesNotExist:
|
|
return Response({"error": "Product not found"}, status=status.HTTP_404_NOT_FOUND)
|
|
|
|
cart_item, created = CartItem.objects.get_or_create(
|
|
cart=cart,
|
|
product=product,
|
|
defaults={'price_at_add': product.price, 'quantity': 0}
|
|
)
|
|
cart_item.quantity += quantity
|
|
cart_item.price_at_add = product.price # update price to latest
|
|
cart_item.save()
|
|
|
|
return Response({"message": "Item added to cart"})
|
|
|
|
class CartItemDetailView(APIView):
|
|
permission_classes = [permissions.IsAuthenticated]
|
|
|
|
def put(self, request, pk):
|
|
try:
|
|
item = CartItem.objects.get(id=pk, cart__user=request.user)
|
|
except CartItem.DoesNotExist:
|
|
return Response({"error": "Cart item not found"}, status=status.HTTP_404_NOT_FOUND)
|
|
|
|
quantity = int(request.data.get('quantity', 1))
|
|
if quantity <= 0:
|
|
item.delete()
|
|
return Response({"message": "Item removed from cart"})
|
|
|
|
item.quantity = quantity
|
|
item.save()
|
|
return Response({"message": "Cart updated"})
|
|
|
|
def delete(self, request, pk):
|
|
try:
|
|
item = CartItem.objects.get(id=pk, cart__user=request.user)
|
|
except CartItem.DoesNotExist:
|
|
return Response({"error": "Cart item not found"}, status=status.HTTP_404_NOT_FOUND)
|
|
|
|
item.delete()
|
|
return Response({"message": "Item removed from cart"})
|
|
|
|
class CheckoutView(APIView):
|
|
permission_classes = [permissions.IsAuthenticated]
|
|
|
|
def post(self, request):
|
|
user = request.user
|
|
try:
|
|
cart = Cart.objects.get(user=user)
|
|
except Cart.DoesNotExist:
|
|
return Response({"error": "Cart is empty"}, status=status.HTTP_400_BAD_REQUEST)
|
|
|
|
items = cart.items.all()
|
|
if not items.exists():
|
|
return Response({"error": "Cart is empty"}, status=status.HTTP_400_BAD_REQUEST)
|
|
|
|
shipping_address = request.data.get('shipping_address')
|
|
if not shipping_address:
|
|
return Response({"error": "Shipping address is required"}, status=status.HTTP_400_BAD_REQUEST)
|
|
|
|
# Calculate total
|
|
total_amount = sum(item.quantity * item.price_at_add for item in items)
|
|
|
|
# Mock Razorpay Order Creation
|
|
razorpay_order_id = f"order_{uuid.uuid4().hex[:14]}"
|
|
|
|
# Create Order
|
|
order = Order.objects.create(
|
|
user=user,
|
|
total_amount=total_amount,
|
|
status='pending',
|
|
razorpay_order_id=razorpay_order_id,
|
|
shipping_address=shipping_address
|
|
)
|
|
|
|
for item in items:
|
|
OrderItem.objects.create(
|
|
order=order,
|
|
product=item.product,
|
|
quantity=item.quantity,
|
|
unit_price=item.price_at_add
|
|
)
|
|
# Deduct stock
|
|
if item.product.stock >= item.quantity:
|
|
item.product.stock -= item.quantity
|
|
item.product.save()
|
|
|
|
# Clear Cart
|
|
items.delete()
|
|
|
|
return Response({
|
|
"message": "Order initiated",
|
|
"order_id": order.id,
|
|
"razorpay_order_id": razorpay_order_id,
|
|
"amount": float(total_amount)
|
|
})
|
|
|
|
class PaymentSuccessView(APIView):
|
|
permission_classes = [permissions.IsAuthenticated]
|
|
|
|
def post(self, request):
|
|
order_id = request.data.get('order_id')
|
|
payment_id = request.data.get('razorpay_payment_id')
|
|
|
|
try:
|
|
order = Order.objects.get(id=order_id, user=request.user)
|
|
except Order.DoesNotExist:
|
|
return Response({"error": "Order not found"}, status=status.HTTP_404_NOT_FOUND)
|
|
|
|
order.status = 'confirmed'
|
|
order.razorpay_payment_id = payment_id
|
|
order.save()
|
|
|
|
return Response({"message": "Payment verified and order confirmed"})
|
|
|
|
class OrderHistoryView(APIView):
|
|
permission_classes = [permissions.IsAuthenticated]
|
|
|
|
def get(self, request):
|
|
orders = Order.objects.filter(user=request.user).order_by('-placed_at')
|
|
serializer = OrderSerializer(orders, many=True)
|
|
return Response(serializer.data)
|
|
|
|
class OrderDetailView(APIView):
|
|
permission_classes = [permissions.IsAuthenticated]
|
|
|
|
def get(self, request, pk):
|
|
try:
|
|
order = Order.objects.get(id=pk, user=request.user)
|
|
except Order.DoesNotExist:
|
|
return Response({"error": "Order not found"}, status=status.HTTP_404_NOT_FOUND)
|
|
serializer = OrderSerializer(order)
|
|
return Response(serializer.data)
|