from django.contrib import messages
from products.models import Product
from django.shortcuts import render, redirect, reverse
from django.shortcuts import HttpResponse, get_object_or_404
# Create your views here.
def view_bag(request):
""" A view that renders the bag contents page """
return render(request, 'bag/bag.html')
def add_to_bag(request, item_id):
""" Add a quantity of the specified product to the shopping bag """
product = get_object_or_404(Product, pk=item_id)
quantity = int(request.POST.get('quantity'))
redirect_url = request.POST.get('redirect_url')
size = None
if 'product_size' in request.POST:
size = request.POST['product_size']
bag = request.session.get('bag', {})
if size:
if item_id in list(bag.keys()):
if size in bag[item_id]['items_by_size'].keys():
bag[item_id]['items_by_size'][size] += quantity
messages.success(
request,
f'Updated size {size.upper()} {product.title} quantity to '
f'{bag[item_id]["items_by_size"][size]}'
)
else:
bag[item_id]['items_by_size'][size] = quantity
messages.success(
request,
f'Added size {size.upper()} {product.title} to your bag'
)
else:
bag[item_id] = {'items_by_size': {size: quantity}}
messages.success(
request,
f'Added size {size.upper()} {product.title} to your bag'
)
else:
if item_id in list(bag.keys()):
bag[item_id] += quantity
messages.success(
request,
f'Updated {product.title} quantity to {bag[item_id]}'
)
else:
bag[item_id] = quantity
messages.success(request, f'Added {product.title} to your bag')
request.session['bag'] = bag
return redirect(redirect_url)
def adjust_bag(request, item_id):
"""Adjust the quantity of the specified product to the specified amount"""
product = get_object_or_404(Product, pk=item_id)
quantity = int(request.POST.get('quantity'))
size = None
if 'product_size' in request.POST:
size = request.POST['product_size']
bag = request.session.get('bag', {})
if size:
if quantity > 0:
bag[item_id]['items_by_size'][size] = quantity
messages.success(
request,
f'Updated size {size.upper()} {product.title} quantity to '
f'{bag[item_id]["items_by_size"][size]}'
)
else:
del bag[item_id]['items_by_size'][size]
if not bag[item_id]['items_by_size']:
bag.pop(item_id)
messages.success(
request,
f'Removed size {size.upper()} {product.title} from your bag'
)
else:
if quantity > 0:
bag[item_id] = quantity
messages.success(
request,
f'Updated {product.title} quantity to {bag[item_id]}'
)
else:
bag.pop(item_id)
messages.success(request, f'Removed {product.title} from your bag')
request.session['bag'] = bag
return redirect(reverse('view_bag'))
def remove_from_bag(request, item_id):
"""Remove the item from the shopping bag"""
try:
product = get_object_or_404(Product, pk=item_id)
size = None
if 'product_size' in request.POST:
size = request.POST['product_size']
bag = request.session.get('bag', {})
if size:
del bag[item_id]['items_by_size'][size]
if not bag[item_id]['items_by_size']:
bag.pop(item_id)
messages.success(
request,
f'Removed size {size.upper()} {product.title} from '
f'your bag'
)
else:
bag.pop(item_id)
messages.success(request, f'Removed {product.title} from your bag')
request.session['bag'] = bag
return redirect(reverse("view_bag"))
except Exception as e:
messages.error(request, f'Error removing item: {e}')
return HttpResponse(status=500)