managers.py 2.0 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556
  1. """ Cart model managers """
  2. from django.db import models
  3. from django.core.exceptions import MultipleObjectsReturned
  4. from django.contrib.contenttypes.models import ContentType
  5. class CartManager(models.Manager):
  6. """ shopping cart manager """
  7. def for_request(self, request):
  8. """ get a cart from a request """
  9. # short circuit if they don't have a session yet.
  10. if not request.session.session_key:
  11. # manually set it as modified so it gets created for us
  12. request.session.modified = True
  13. return None
  14. lookup_kwargs = {"cart_id": request.session.session_key}
  15. try:
  16. cart, new = self.get_or_create(**lookup_kwargs)
  17. # associate the logged in user to cart, if they are logged in.
  18. if new and request.user.is_authenticated():
  19. cart.owner = request.user
  20. cart.save()
  21. except MultipleObjectsReturned:
  22. cart = self.filter(**lookup_kwargs).order_by("id")[0]
  23. return cart
  24. def for_session(self, session_key):
  25. """ get a cart from a session """
  26. lookup_kwargs = {
  27. "cart_id": session_key,
  28. }
  29. try:
  30. cart, new = self.get_or_create(**lookup_kwargs)
  31. except MultipleObjectsReturned:
  32. cart = self.filter(**lookup_kwargs).order_by("id")[0]
  33. return cart
  34. class CartItemManager(models.Manager):
  35. """ Cart Item manager"""
  36. def item_for_request(self, session_key, item_token):
  37. """ get an item from a request """
  38. return self.get(cart_token=item_token, cart__session_key=session_key)
  39. def get(self, *args, **kwargs):
  40. """ get a cart items """
  41. if "product" in kwargs:
  42. kwargs["content_type"] = ContentType.objects.get_for_model(
  43. type(kwargs["product"])
  44. )
  45. kwargs["object_id"] = kwargs["product"].pk
  46. del kwargs["product"]
  47. return super(CartItemManager, self).get(*args, **kwargs)