98 lines
3.2 KiB
Python
98 lines
3.2 KiB
Python
from django.shortcuts import render, get_object_or_404, redirect
|
|
from django.contrib.auth.decorators import login_required
|
|
from .models import Product, Category, Order, OrderItem
|
|
from django.contrib import messages
|
|
|
|
def index(request):
|
|
query = request.GET.get('q')
|
|
category_id = request.GET.get('category')
|
|
|
|
products = Product.objects.all().order_by('-created_at')
|
|
categories = Category.objects.all()
|
|
|
|
if query:
|
|
products = products.filter(title__icontains=query) | products.filter(description__icontains=query)
|
|
|
|
if category_id:
|
|
products = products.filter(category_id=category_id)
|
|
|
|
context = {
|
|
'products': products,
|
|
'categories': categories,
|
|
'selected_category': int(category_id) if category_id and category_id.isdigit() else None,
|
|
'query': query
|
|
}
|
|
return render(request, 'core/index.html', context)
|
|
|
|
def product_detail(request, pk):
|
|
product = get_object_or_404(Product, pk=pk)
|
|
related_products = Product.objects.filter(category=product.category).exclude(pk=pk)[:4]
|
|
return render(request, 'core/product_detail.html', {
|
|
'product': product,
|
|
'related_products': related_products
|
|
})
|
|
|
|
def add_to_cart(request, pk):
|
|
product = get_object_or_404(Product, pk=pk)
|
|
cart = request.session.get('cart', {})
|
|
|
|
product_id = str(pk)
|
|
if product_id in cart:
|
|
cart[product_id]['quantity'] += 1
|
|
else:
|
|
cart[product_id] = {
|
|
'title': product.title,
|
|
'price': str(product.price),
|
|
'quantity': 1,
|
|
'image_url': product.image_url
|
|
}
|
|
|
|
request.session['cart'] = cart
|
|
messages.success(request, f"{product.title} added to cart.")
|
|
return redirect('cart_detail')
|
|
|
|
def cart_detail(request):
|
|
cart = request.session.get('cart', {})
|
|
total = sum(float(item['price']) * item['quantity'] for item in cart.values())
|
|
return render(request, 'core/cart.html', {'cart': cart, 'total': total})
|
|
|
|
def remove_from_cart(request, pk):
|
|
cart = request.session.get('cart', {})
|
|
product_id = str(pk)
|
|
if product_id in cart:
|
|
del cart[product_id]
|
|
request.session['cart'] = cart
|
|
messages.info(request, "Item removed from cart.")
|
|
return redirect('cart_detail')
|
|
|
|
@login_required
|
|
def checkout(request):
|
|
cart = request.session.get('cart', {})
|
|
if not cart:
|
|
messages.warning(request, "Your cart is empty.")
|
|
return redirect('index')
|
|
|
|
total = sum(float(item['price']) * item['quantity'] for item in cart.values())
|
|
|
|
# Create Order
|
|
order = Order.objects.create(user=request.user, total_amount=total)
|
|
|
|
# Create OrderItems
|
|
for product_id, item in cart.items():
|
|
product = get_object_or_404(Product, pk=product_id)
|
|
OrderItem.objects.create(
|
|
order=order,
|
|
product=product,
|
|
quantity=item['quantity'],
|
|
price=item['price']
|
|
)
|
|
# Update stock
|
|
if product.stock >= item['quantity']:
|
|
product.stock -= item['quantity']
|
|
product.save()
|
|
|
|
# Clear cart
|
|
request.session['cart'] = {}
|
|
|
|
return render(request, 'core/checkout_success.html', {'order': order})
|