146 lines
4.4 KiB
Python
146 lines
4.4 KiB
Python
import os
|
|
import platform
|
|
|
|
from django import get_version as django_version
|
|
from django.contrib.auth.decorators import login_required
|
|
from django.db import transaction
|
|
from django.db.models import Count, DecimalField, ExpressionWrapper, F, Sum
|
|
from django.shortcuts import get_object_or_404, redirect, render
|
|
from django.utils import timezone
|
|
|
|
from .models import Order, OrderItem, Product
|
|
|
|
|
|
def home(request):
|
|
"""Render the product catalog landing page."""
|
|
products = Product.objects.all().order_by('-created_at')
|
|
|
|
context = {
|
|
"products": products,
|
|
"django_version": django_version(),
|
|
}
|
|
return render(request, "core/index.html", context)
|
|
|
|
|
|
def product_detail(request, pk):
|
|
product = get_object_or_404(Product, pk=pk)
|
|
return render(request, "core/product_detail.html", {"product": product})
|
|
|
|
|
|
def _is_seller(user):
|
|
return hasattr(user, "userprofile") and user.userprofile.is_seller
|
|
|
|
|
|
@login_required
|
|
def dashboard_redirect(request):
|
|
if _is_seller(request.user):
|
|
return redirect("seller_dashboard")
|
|
return redirect("buyer_dashboard")
|
|
|
|
|
|
@login_required
|
|
def buyer_dashboard(request):
|
|
if _is_seller(request.user):
|
|
return redirect("seller_dashboard")
|
|
|
|
recent_orders = (
|
|
Order.objects.filter(buyer=request.user)
|
|
.prefetch_related("items__product")
|
|
.order_by("-created_at")[:5]
|
|
)
|
|
total_orders = Order.objects.filter(buyer=request.user).count()
|
|
|
|
context = {
|
|
"dashboard_title": "Buyer Dashboard",
|
|
"active_tab": "buyer",
|
|
"recent_orders": recent_orders,
|
|
"total_orders": total_orders,
|
|
}
|
|
return render(request, "core/buyer_dashboard.html", context)
|
|
|
|
|
|
@login_required
|
|
def seller_dashboard(request):
|
|
if not _is_seller(request.user):
|
|
return redirect("buyer_dashboard")
|
|
|
|
seller_products = Product.objects.filter(seller=request.user)
|
|
sales_expression = ExpressionWrapper(
|
|
F("quantity") * F("price"), output_field=DecimalField(max_digits=12, decimal_places=2)
|
|
)
|
|
sales_summary = OrderItem.objects.filter(product__seller=request.user).aggregate(
|
|
total_items=Sum("quantity"),
|
|
total_revenue=Sum(sales_expression),
|
|
total_orders=Count("order", distinct=True),
|
|
)
|
|
recent_sales = (
|
|
OrderItem.objects.filter(product__seller=request.user)
|
|
.select_related("product", "order__buyer")
|
|
.order_by("-order__created_at")[:8]
|
|
)
|
|
|
|
context = {
|
|
"dashboard_title": "Seller Dashboard",
|
|
"active_tab": "seller",
|
|
"product_count": seller_products.count(),
|
|
"total_orders": sales_summary["total_orders"] or 0,
|
|
"total_items": sales_summary["total_items"] or 0,
|
|
"total_revenue": sales_summary["total_revenue"] or 0,
|
|
"recent_sales": recent_sales,
|
|
}
|
|
return render(request, "core/seller_dashboard.html", context)
|
|
|
|
|
|
def add_to_cart(request, pk):
|
|
product = get_object_or_404(Product, pk=pk)
|
|
cart = request.session.get("cart", {})
|
|
product_id = str(pk)
|
|
cart[product_id] = cart.get(product_id, 0) + 1
|
|
request.session["cart"] = cart
|
|
return redirect("home")
|
|
|
|
|
|
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
|
|
return redirect("cart_view")
|
|
|
|
|
|
def cart_view(request):
|
|
cart = request.session.get("cart", {})
|
|
items = []
|
|
total_price = 0
|
|
for product_id, quantity in cart.items():
|
|
try:
|
|
product = Product.objects.get(pk=product_id)
|
|
items.append({"product": product, "quantity": quantity, "subtotal": product.price * quantity})
|
|
total_price += product.price * quantity
|
|
except Product.DoesNotExist:
|
|
continue
|
|
context = {"items": items, "total_price": total_price}
|
|
return render(request, "core/cart.html", context)
|
|
|
|
|
|
@login_required
|
|
@transaction.atomic
|
|
def checkout(request):
|
|
cart = request.session.get("cart", {})
|
|
if not cart:
|
|
return redirect("cart_view")
|
|
|
|
order = Order.objects.create(buyer=request.user)
|
|
|
|
for product_id, quantity in cart.items():
|
|
product = get_object_or_404(Product, pk=product_id)
|
|
OrderItem.objects.create(
|
|
order=order,
|
|
product=product,
|
|
quantity=quantity,
|
|
price=product.price
|
|
)
|
|
|
|
request.session["cart"] = {}
|
|
return redirect("buyer_dashboard") |