123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141 |
- """ Code to handle the website shopping cart """
- from datetime import datetime, timedelta
- import logging
- from django.shortcuts import get_object_or_404
- from .models import Cart, CartItem, CartItemGiftDetail
- LOGGER = logging.getLogger("cart")
- def get_cart_from_key(cart_key):
- """ Given a cart_id, get the cart """
- return Cart.objects.for_session(cart_key)
- def get_cart(request):
- """ get the cart for the given request """
- return Cart.objects.for_request(request)
- def get_cart_items(request):
- """ return all items from the current user's cart """
- cart = get_cart(request)
- return cart.cart_items
- def empty_cart(request):
- """ empties the shopping cart of the current customer """
- user_cart = get_cart_items(request)
- user_cart.delete()
- def remove_subscriptions(request):
- """ removes any subscriptions from the cart """
- user_cart = get_cart_items(request)
- for item in user_cart:
- if item.product.is_subscription:
- item.delete()
- def get_single_item(request, cart_token):
- """ get the one item from the cart """
- return get_object_or_404(CartItem, cart_token=cart_token, cart=get_cart(request))
- def remove_from_cart(request, cart_token):
- """ function that removes a single product instance from the
- current customer's shopping cart
- """
- cart_item = get_single_item(request, cart_token)
- if cart_item:
- gift_detail = cart_item.gift_detail
- if gift_detail:
- gift_detail.delete()
- cart_item.delete()
- def cart_subtotal(request):
- """ cart subtotal """
- cart = get_cart(request)
- return cart.cart_subtotal
- def cart_distinct_item_count(request):
- """ returns the total number of items in the user's cart """
- cart = get_cart(request)
- return cart.item_count
- def is_empty(request):
- """ Check if the cart is empty """
- return cart_distinct_item_count(request) == 0
- def update_cart(request, cart_item, quantity):
- """ function takes the quantity for single product instance in the
- current customer's shopping cart, and updates it.
- """
- if cart_item:
- if int(quantity) > 0:
- cart_item.quantity = int(quantity)
- cart_item.save()
- else:
- remove_from_cart(request, cart_item.cart_token)
- def add_to_cart(request, item, account_number=None, gift_detail=None, quantity=1):
- """ function that takes an item instance to the current
- customer's shopping cart
- :param detail: dictionary of additional cart information
- """
- # get cart
- cart = get_cart(request)
- if not cart:
- LOGGER.info("Cart is None, just returning. See this with search bots")
- return
- # get products in cart
- cart_products = cart.cart_items
- product_in_cart = False
- # check to see if item is already in cart
- for cart_item in cart_products:
- if cart_item.product.pk == item.pk:
- # update the quantity if found
- # only works if we can have one item and no options
- cart_item.quantity = cart_item.quantity + quantity
- product_in_cart = True
- cart_item.save()
- if not product_in_cart:
- # create and save a new cart item
- cart_item = CartItem()
- cart_item.cart = cart
- cart_item.product = item
- cart_item.quantity = quantity
- cart_item.account_number = account_number
- cart_item.save()
- if gift_detail:
- cart_item_gift_detail = CartItemGiftDetail(**gift_detail)
- cart_item_gift_detail.save()
- cart_item.gift_detail = cart_item_gift_detail
- cart_item.save()
- def remove_old_cart_items():
- """ 1. calculate date of 30 days ago,
- 2. find how many carts are older then date
- 3. delete those Cart instances
- """
- LOGGER.debug("Removing old carts")
- remove_before = datetime.now() + timedelta(days=-30)
- # TODO, keep carts related to checkout?
- old_items = Cart.objects.filter(last_update__lt=remove_before)
- old_item_count = old_items.count()
- if old_item_count > 0:
- old_items.delete()
- LOGGER.debug("{0} carts were removed".format(old_item_count))
|