From 84c40a1e1f28d630f3aa0c65de8203e8a75ddb17 Mon Sep 17 00:00:00 2001
From: Christopher Neugebauer <chrisjrn@gmail.com>
Date: Sat, 3 Sep 2016 15:08:25 +1000
Subject: [PATCH] Refactors ItemController, add items_released

---
 registrasion/controllers/item.py | 42 ++++++++++++++++++++++----------
 1 file changed, 29 insertions(+), 13 deletions(-)

diff --git a/registrasion/controllers/item.py b/registrasion/controllers/item.py
index a36604e5..f2d0a2ae 100644
--- a/registrasion/controllers/item.py
+++ b/registrasion/controllers/item.py
@@ -30,7 +30,7 @@ class ItemController(object):
     def __init__(self, user):
         self.user = user
 
-    def items_purchased(self, category=None):
+    def _items(self, cart_status, category=None):
         ''' Aggregates the items that this user has purchased.
 
         Arguments:
@@ -45,7 +45,7 @@ class ItemController(object):
 
         in_cart = (
             Q(productitem__cart__user=self.user) &
-            Q(productitem__cart__status=commerce.Cart.STATUS_PAID)
+            Q(productitem__cart__status=cart_status)
         )
 
         quantities_in_cart = When(
@@ -72,6 +72,20 @@ class ItemController(object):
             out.append(ProductAndQuantity(prod, prod.quantity))
         return out
 
+    def items_purchased(self, category=None):
+        ''' Aggregates the items that this user has purchased.
+
+        Arguments:
+            category (Optional[models.inventory.Category]): the category
+                of items to restrict to.
+
+        Returns:
+            [ProductAndQuantity, ...]: A list of product-quantity pairs,
+                aggregating like products from across multiple invoices.
+
+        '''
+        return self._items(commerce.Cart.STATUS_PAID)
+
     def items_pending(self):
         ''' Gets all of the items that the user has reserved, but has not yet
         paid for.
@@ -82,14 +96,16 @@ class ItemController(object):
 
         '''
 
-        all_items = commerce.ProductItem.objects.filter(
-            cart__user=self.user,
-            cart__status=commerce.Cart.STATUS_ACTIVE,
-        ).select_related(
-            "product",
-            "product__category",
-        ).order_by(
-            "product__category__order",
-            "product__order",
-        )
-        return all_items
+        return self._items(commerce.Cart.STATUS_ACTIVE)
+
+    def items_released(self):
+        ''' Gets all of the items that the user previously paid for, but has
+        since refunded.
+
+        Returns:
+            [ProductAndQuantity, ...]: A list of product-quantity pairs for the
+                items that the user has not yet paid for.
+
+        '''
+
+        return self._items(commerce.Cart.STATUS_RELEASED)