customerwebsitebackend/orders/views.py
vickytechkey 0ef971cec4
All checks were successful
Deploy Beta (NATIVE) / deploy (push) Successful in 31s
initial commit
2026-08-14 18:58:18 +05:30

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)