""" Cart model managers """ from django.db import models from django.core.exceptions import MultipleObjectsReturned from django.contrib.contenttypes.models import ContentType class CartManager(models.Manager): """ shopping cart manager """ def for_request(self, request): """ get a cart from a request """ # short circuit if they don't have a session yet. if not request.session.session_key: # manually set it as modified so it gets created for us request.session.modified = True return None lookup_kwargs = {"cart_id": request.session.session_key} try: cart, new = self.get_or_create(**lookup_kwargs) # associate the logged in user to cart, if they are logged in. if new and request.user.is_authenticated(): cart.owner = request.user cart.save() except MultipleObjectsReturned: cart = self.filter(**lookup_kwargs).order_by("id")[0] return cart def for_session(self, session_key): """ get a cart from a session """ lookup_kwargs = { "cart_id": session_key, } try: cart, new = self.get_or_create(**lookup_kwargs) except MultipleObjectsReturned: cart = self.filter(**lookup_kwargs).order_by("id")[0] return cart class CartItemManager(models.Manager): """ Cart Item manager""" def item_for_request(self, session_key, item_token): """ get an item from a request """ return self.get(cart_token=item_token, cart__session_key=session_key) def get(self, *args, **kwargs): """ get a cart items """ if "product" in kwargs: kwargs["content_type"] = ContentType.objects.get_for_model( type(kwargs["product"]) ) kwargs["object_id"] = kwargs["product"].pk del kwargs["product"] return super(CartItemManager, self).get(*args, **kwargs)