Files
@ 2c2fb3555753
Branch filter:
Location: symposion_app/vendor/registrasion/controllers/item.py - annotation
2c2fb3555753
3.6 KiB
text/x-python
Merge branch 'ticket-testing' into 'master'
Update inventory for 2018
See merge request LCA2018/symposion_app!49
Update inventory for 2018
See merge request LCA2018/symposion_app!49
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 | 68aa9b067bdb 68aa9b067bdb faa25c9b3a7d bcb63fd1cd12 faa25c9b3a7d 68aa9b067bdb 68aa9b067bdb 68aa9b067bdb faa25c9b3a7d 68aa9b067bdb 68aa9b067bdb 68aa9b067bdb 68aa9b067bdb 68aa9b067bdb 68aa9b067bdb 68aa9b067bdb 68aa9b067bdb 68aa9b067bdb 68aa9b067bdb 68aa9b067bdb 68aa9b067bdb 68aa9b067bdb 68aa9b067bdb 68aa9b067bdb 68aa9b067bdb 68aa9b067bdb 68aa9b067bdb 68aa9b067bdb 68aa9b067bdb 68aa9b067bdb 68aa9b067bdb 68aa9b067bdb 68aa9b067bdb 68aa9b067bdb 68aa9b067bdb 68aa9b067bdb 84c40a1e1f28 68aa9b067bdb 68aa9b067bdb 68aa9b067bdb faa25c9b3a7d 68aa9b067bdb 68aa9b067bdb 68aa9b067bdb 68aa9b067bdb 68aa9b067bdb 68aa9b067bdb 68aa9b067bdb 68aa9b067bdb 68aa9b067bdb faa25c9b3a7d faa25c9b3a7d faa25c9b3a7d faa25c9b3a7d faa25c9b3a7d 68aa9b067bdb 68aa9b067bdb faa25c9b3a7d faa25c9b3a7d faa25c9b3a7d 68aa9b067bdb 68aa9b067bdb 68aa9b067bdb 68aa9b067bdb 68aa9b067bdb 68aa9b067bdb 68aa9b067bdb 68aa9b067bdb 68aa9b067bdb 68aa9b067bdb 68aa9b067bdb 68aa9b067bdb 68aa9b067bdb 68aa9b067bdb 68aa9b067bdb 68aa9b067bdb 68aa9b067bdb 68aa9b067bdb 68aa9b067bdb 68aa9b067bdb 68aa9b067bdb 68aa9b067bdb 68aa9b067bdb 68aa9b067bdb faa25c9b3a7d faa25c9b3a7d faa25c9b3a7d faa25c9b3a7d faa25c9b3a7d 84c40a1e1f28 84c40a1e1f28 84c40a1e1f28 84c40a1e1f28 84c40a1e1f28 84c40a1e1f28 84c40a1e1f28 84c40a1e1f28 84c40a1e1f28 84c40a1e1f28 84c40a1e1f28 84c40a1e1f28 a27264ac9289 84c40a1e1f28 68aa9b067bdb 68aa9b067bdb 68aa9b067bdb 68aa9b067bdb 68aa9b067bdb 68aa9b067bdb 68aa9b067bdb 68aa9b067bdb 68aa9b067bdb 68aa9b067bdb 84c40a1e1f28 84c40a1e1f28 84c40a1e1f28 84c40a1e1f28 84c40a1e1f28 84c40a1e1f28 84c40a1e1f28 84c40a1e1f28 84c40a1e1f28 84c40a1e1f28 84c40a1e1f28 84c40a1e1f28 84c40a1e1f28 | ''' NEEDS TESTS '''
import operator
from functools import reduce
from registrasion.models import commerce
from registrasion.models import inventory
from collections import Iterable
from collections import namedtuple
from django.db.models import Case
from django.db.models import Q
from django.db.models import Sum
from django.db.models import When
from django.db.models import Value
_ProductAndQuantity = namedtuple("ProductAndQuantity", ["product", "quantity"])
class ProductAndQuantity(_ProductAndQuantity):
''' Class that holds a product and a quantity.
Attributes:
product (models.inventory.Product)
quantity (int)
'''
pass
class ItemController(object):
def __init__(self, user):
self.user = user
def _items(self, cart_status, category=None):
''' Aggregates the items that this user has purchased.
Arguments:
cart_status (int or Iterable(int)): etc
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.
'''
if not isinstance(cart_status, Iterable):
cart_status = [cart_status]
status_query = (
Q(productitem__cart__status=status) for status in cart_status
)
in_cart = Q(productitem__cart__user=self.user)
in_cart = in_cart & reduce(operator.__or__, status_query)
quantities_in_cart = When(
in_cart,
then="productitem__quantity",
)
quantities_or_zero = Case(
quantities_in_cart,
default=Value(0),
)
products = inventory.Product.objects
if category:
products = products.filter(category=category)
products = products.select_related("category")
products = products.annotate(quantity=Sum(quantities_or_zero))
products = products.filter(quantity__gt=0)
out = []
for prod in products:
out.append(ProductAndQuantity(prod, prod.quantity))
return out
def items_pending_or_purchased(self):
''' Returns the items that this user has purchased or has pending. '''
status = [commerce.Cart.STATUS_PAID, commerce.Cart.STATUS_ACTIVE]
return self._items(status)
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, category=category)
def items_pending(self):
''' Gets all of the items that the user has reserved, but has not yet
paid for.
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_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)
|