Files
@ 2a850c49bc5e
Branch filter:
Location: symposion_app/registrasion/controllers/product.py - annotation
2a850c49bc5e
2.7 KiB
text/x-python
Fixes some documentation snafus
45aa83f854cb 45aa83f854cb a79ad3520e60 a79ad3520e60 0d458bea068e a79ad3520e60 a79ad3520e60 a79ad3520e60 875f736d67c5 875f736d67c5 d9e433659d01 efb73e7a682f 145fd057aca0 145fd057aca0 d9e433659d01 d9e433659d01 d9e433659d01 d9e433659d01 d9e433659d01 d9e433659d01 d9e433659d01 45aa83f854cb 45aa83f854cb 45aa83f854cb a79ad3520e60 45aa83f854cb 45aa83f854cb 45aa83f854cb 45aa83f854cb 875f736d67c5 53413388e016 45aa83f854cb 45aa83f854cb 45aa83f854cb 45aa83f854cb 53413388e016 53413388e016 c6fdfa496e84 941caa30d9f4 45aa83f854cb 194f98bcc4d0 45aa83f854cb 45aa83f854cb c6fdfa496e84 941caa30d9f4 194f98bcc4d0 194f98bcc4d0 145fd057aca0 194f98bcc4d0 cc318dfa9ba8 cc318dfa9ba8 194f98bcc4d0 194f98bcc4d0 834233cd72a9 e3ec12814779 834233cd72a9 45aa83f854cb a79ad3520e60 efb73e7a682f 941caa30d9f4 a79ad3520e60 a79ad3520e60 a79ad3520e60 941caa30d9f4 941caa30d9f4 a79ad3520e60 a79ad3520e60 941caa30d9f4 1c6dc1278147 a79ad3520e60 a79ad3520e60 a79ad3520e60 a79ad3520e60 a79ad3520e60 a79ad3520e60 a79ad3520e60 a79ad3520e60 a79ad3520e60 d9e433659d01 a79ad3520e60 a79ad3520e60 a79ad3520e60 8f233c79430f 8f233c79430f a79ad3520e60 a79ad3520e60 a79ad3520e60 0d458bea068e d9e433659d01 a79ad3520e60 a79ad3520e60 941caa30d9f4 | import itertools
from django.db.models import Case
from django.db.models import F, Q
from django.db.models import Sum
from django.db.models import When
from django.db.models import Value
from registrasion.models import commerce
from registrasion.models import inventory
from .batch import BatchController
from .category import CategoryController
from .flag import FlagController
class ProductController(object):
def __init__(self, product):
self.product = product
@classmethod
def available_products(cls, user, category=None, products=None):
''' Returns a list of all of the products that are available per
flag conditions from the given categories. '''
if category is None and products is None:
raise ValueError("You must provide products or a category")
if category is not None:
all_products = inventory.Product.objects.filter(category=category)
all_products = all_products.select_related("category")
else:
all_products = []
if products is not None:
all_products = set(itertools.chain(all_products, products))
category_remainders = CategoryController.user_remainders(user)
product_remainders = ProductController.user_remainders(user)
passed_limits = set(
product
for product in all_products
if category_remainders[product.category.id] > 0
if product_remainders[product.id] > 0
)
failed_and_messages = FlagController.test_flags(
user, products=passed_limits
)
failed_conditions = set(i[0] for i in failed_and_messages)
out = list(passed_limits - failed_conditions)
out.sort(key=lambda product: product.order)
return out
@classmethod
@BatchController.memoise
def user_remainders(cls, user):
'''
Return:
Mapping[int->int]: A dictionary that maps the product ID to the
user's remainder for that product.
'''
products = inventory.Product.objects.all()
cart_filter = (
Q(productitem__cart__user=user) &
Q(productitem__cart__status=commerce.Cart.STATUS_PAID)
)
quantity = When(
cart_filter,
then='productitem__quantity'
)
quantity_or_zero = Case(
quantity,
default=Value(0),
)
remainder = Case(
When(limit_per_user=None, then=Value(99999999)),
default=F('limit_per_user') - Sum(quantity_or_zero),
)
products = products.annotate(remainder=remainder)
return dict((product.id, product.remainder) for product in products)
|