diff --git a/registrasion/controllers/cart.py b/registrasion/controllers/cart.py index 83e08ef8..b445a802 100644 --- a/registrasion/controllers/cart.py +++ b/registrasion/controllers/cart.py @@ -67,6 +67,7 @@ class CartController(object): # Marks the carts that are currently in batches + _FOR_USER = {} _BATCH_COUNT = collections.defaultdict(int) _MODIFIED_CARTS = set() @@ -85,10 +86,11 @@ class CartController(object): revision is increased. ''' - # TODO cache carts mid-batch? + if user not in cls._FOR_USER: + _ctrl = cls.for_user(user) + cls._FOR_USER[user] = (_ctrl, _ctrl.cart.id) - ctrl = cls.for_user(user) - _id = ctrl.cart.id + ctrl, _id = cls._FOR_USER[user] cls._BATCH_COUNT[_id] += 1 try: @@ -108,10 +110,15 @@ class CartController(object): # Only end on the outermost batch marker, and only if # it excited cleanly, and a modification occurred modified = _id in cls._MODIFIED_CARTS - if modified and cls._BATCH_COUNT[_id] == 0 and success: + outermost = cls._BATCH_COUNT[_id] == 0 + if modified and outermost and success: ctrl._end_batch() cls._MODIFIED_CARTS.remove(_id) + # Clear out the cache on the outermost operation + if outermost: + del cls._FOR_USER[user] + def _fail_if_cart_is_not_active(self): self.cart.refresh_from_db() if self.cart.status != commerce.Cart.STATUS_ACTIVE: