managers.py 2.0 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758
  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 = {
  15. 'cart_id': request.session.session_key
  16. }
  17. try:
  18. cart, new = self.get_or_create(**lookup_kwargs)
  19. # associate the logged in user to cart, if they are logged in.
  20. if new and request.user.is_authenticated():
  21. cart.owner = request.user
  22. cart.save()
  23. except MultipleObjectsReturned:
  24. cart = self.filter(**lookup_kwargs).order_by('id')[0]
  25. return cart
  26. def for_session(self, session_key):
  27. """ get a cart from a session """
  28. lookup_kwargs = {
  29. 'cart_id': session_key,
  30. }
  31. try:
  32. cart, new = self.get_or_create(**lookup_kwargs)
  33. except MultipleObjectsReturned:
  34. cart = self.filter(**lookup_kwargs).order_by('id')[0]
  35. return cart
  36. class CartItemManager(models.Manager):
  37. """ Cart Item manager"""
  38. def item_for_request(self, session_key, item_token):
  39. """ get an item from a request """
  40. return self.get(cart_token=item_token,
  41. cart__session_key=session_key)
  42. def get(self, *args, **kwargs):
  43. """ get a cart items """
  44. if 'product' in kwargs:
  45. kwargs['content_type'] = ContentType.objects.get_for_model(
  46. type(kwargs['product']))
  47. kwargs['object_id'] = kwargs['product'].pk
  48. del(kwargs['product'])
  49. return super(CartItemManager, self).get(*args, **kwargs)