190 lines
6.6 KiB
Python
190 lines
6.6 KiB
Python
from django.shortcuts import render, redirect, get_object_or_404
|
|
from django.core.exceptions import ObjectDoesNotExist
|
|
from django.http import HttpResponse
|
|
from django.contrib.auth.decorators import login_required
|
|
|
|
from .models import Cart, CartItem
|
|
from shop.models import Product
|
|
from shop.models import Variation
|
|
|
|
|
|
def _cart_id(request):
|
|
cart = request.session.session_key
|
|
if not cart :
|
|
cart = request.session.create()
|
|
return cart
|
|
|
|
|
|
def add_cart(request, product_id):
|
|
current_user = request.user
|
|
product = Product.objects.get(id=product_id) # get the product
|
|
product_variation = []
|
|
if current_user.is_authenticated:
|
|
product_variation = []
|
|
if request.method == 'POST':
|
|
for item in request.POST :
|
|
key = item
|
|
value = request.POST[key]
|
|
try:
|
|
variation = Variation.objects.get(product=product, variation_category__iexact=key, variation_value__iexact=value)
|
|
product_variation.append(variation)
|
|
except:
|
|
pass
|
|
is_cart_item_exist = CartItem.objects.filter(product=product, user=current_user).exists()
|
|
if is_cart_item_exist:
|
|
cart_item = CartItem.objects.filter(product=product, user=current_user)
|
|
ex_var_list = []
|
|
id = []
|
|
for item in cart_item:
|
|
existing_variation = item.variation.all()
|
|
ex_var_list.append(list(existing_variation))
|
|
id.append(item.id)
|
|
|
|
if product_variation in ex_var_list:
|
|
# increase the cart item quantity
|
|
index = ex_var_list.index(product_variation)
|
|
item_id = id[index]
|
|
item = CartItem.objects.get(product=product, id=item_id)
|
|
item.quantity += 1
|
|
item.save()
|
|
else:
|
|
item = CartItem.objects.create(product=product, quantity=1, user=current_user)
|
|
if len(product_variation) > 0 :
|
|
item.variation.clear()
|
|
item.variation.add(*product_variation)
|
|
item.save()
|
|
|
|
else:
|
|
cart_item = CartItem.objects.create(
|
|
product=product,
|
|
quantity = 1,
|
|
user = current_user,
|
|
)
|
|
if len(product_variation) > 0 :
|
|
cart_item.variation.clear()
|
|
cart_item.variation.add(*product_variation)
|
|
cart_item.save()
|
|
|
|
return redirect('cart:cart')
|
|
|
|
# if the user is not authencated
|
|
else:
|
|
|
|
if request.method == 'POST':
|
|
for item in request.POST :
|
|
key = item
|
|
value = request.POST[key]
|
|
try:
|
|
variation = Variation.objects.get(product=product, variation_category__iexact=key, variation_value__iexact=value)
|
|
product_variation.append(variation)
|
|
except:
|
|
pass
|
|
|
|
try:
|
|
cart = Cart.objects.get(cart_id=_cart_id(request)) # get the cart using the cart_id present in the session
|
|
except Cart.DoesNotExist:
|
|
cart = Cart.objects.create(cart_id=_cart_id(request))
|
|
|
|
cart.save()
|
|
|
|
is_cart_item_exist = CartItem.objects.filter(product=product, cart=cart).exists()
|
|
if is_cart_item_exist:
|
|
cart_item = CartItem.objects.filter(product=product, cart=cart)
|
|
ex_var_list = []
|
|
id = []
|
|
for item in cart_item:
|
|
existing_variation = item.variation.all()
|
|
ex_var_list.append(list(existing_variation))
|
|
id.append(item.id)
|
|
|
|
if product_variation in ex_var_list:
|
|
# increase the cart item quantity
|
|
index = ex_var_list.index(product_variation)
|
|
item_id = id[index]
|
|
item = CartItem.objects.get(product=product, id=item_id)
|
|
item.quantity += 1
|
|
item.save()
|
|
else:
|
|
item = CartItem.objects.create(product=product, quantity=1, cart=cart)
|
|
if len(product_variation) > 0 :
|
|
item.variation.clear()
|
|
item.variation.add(*product_variation)
|
|
item.save()
|
|
|
|
else:
|
|
cart_item = CartItem.objects.create(
|
|
product=product,
|
|
quantity = 1,
|
|
cart=cart,
|
|
)
|
|
if len(product_variation) > 0 :
|
|
cart_item.variation.clear()
|
|
cart_item.variation.add(*product_variation)
|
|
cart_item.save()
|
|
|
|
return redirect('cart:cart')
|
|
|
|
def remove_cart(request, product_id, cart_item_id):
|
|
product = get_object_or_404(Product, id=product_id)
|
|
try:
|
|
if request.user.is_authenticated:
|
|
cart_item = CartItem.objects.get(product=product, user=request.user, id=cart_item_id)
|
|
else:
|
|
cart = Cart.objects.get(cart_id=_cart_id(request))
|
|
cart_item = CartItem.objects.get(product=product, cart=cart, id=cart_item_id)
|
|
if cart_item.quantity > 1 :
|
|
cart_item.quantity -= 1
|
|
cart_item.save()
|
|
else :
|
|
cart_item.delete()
|
|
except:
|
|
pass
|
|
|
|
return redirect('cart:cart')
|
|
|
|
|
|
def remove_cart_item(request, product_id, cart_item_id):
|
|
product = get_object_or_404(Product, id=product_id)
|
|
if request.user.is_authenticated:
|
|
cart_item = CartItem.objects.get(product=product, user=request.user, id=cart_item_id)
|
|
else:
|
|
cart = Cart.objects.get(cart_id=_cart_id(request))
|
|
cart_item = CartItem.objects.get(product=product, cart=cart, id=cart_item_id)
|
|
cart_item.delete()
|
|
return redirect('cart:cart')
|
|
|
|
def cart(request, total_price=0, quantity=0, cart_items=None):
|
|
grand_total = 0
|
|
tax = 0
|
|
|
|
try:
|
|
if request.user.is_authenticated:
|
|
cart_items = CartItem.objects.filter(user=request.user, is_active=True)
|
|
else:
|
|
cart = Cart.objects.get(cart_id=_cart_id(request))
|
|
cart_items = CartItem.objects.filter(cart=cart, is_active=True)
|
|
for cart_item in cart_items:
|
|
total_price += (cart_item.product.price * cart_item.quantity)
|
|
quantity += cart_item.quantity
|
|
|
|
except ObjectDoesNotExist:
|
|
pass
|
|
|
|
|
|
tax = round(((2 * total_price)/100), 2)
|
|
grand_total = total_price + tax
|
|
handing = 15.00
|
|
total = float(grand_total) + handing
|
|
|
|
context = {
|
|
'total' : total_price,
|
|
'quantity': quantity,
|
|
'cart_items':cart_items,
|
|
'order_total':total,
|
|
'vat' : tax,
|
|
'handing':handing,
|
|
}
|
|
|
|
return render(request, 'shop/cart/cart.html', context)
|
|
|