Files
@ e9ebf5da03ea
Branch filter:
Location: symposion_app/registrasion/controllers/product.py - annotation
e9ebf5da03ea
2.5 KiB
text/x-python
Writes inventory and overview documentation, and updates docstrings on a LOT of modules.
45aa83f854cb 45aa83f854cb 0d458bea068e 875f736d67c5 875f736d67c5 d9e433659d01 576dddcaad19 d9e433659d01 d9e433659d01 d9e433659d01 d9e433659d01 d9e433659d01 d9e433659d01 d9e433659d01 d9e433659d01 45aa83f854cb 45aa83f854cb 45aa83f854cb c24b9ee213b9 45aa83f854cb c24b9ee213b9 45aa83f854cb 45aa83f854cb 45aa83f854cb 45aa83f854cb 875f736d67c5 53413388e016 45aa83f854cb 45aa83f854cb 45aa83f854cb 45aa83f854cb 53413388e016 53413388e016 53413388e016 53413388e016 53413388e016 53413388e016 53413388e016 53413388e016 53413388e016 45aa83f854cb 194f98bcc4d0 45aa83f854cb 45aa83f854cb 53413388e016 1c6dc1278147 194f98bcc4d0 194f98bcc4d0 c24b9ee213b9 194f98bcc4d0 cc318dfa9ba8 cc318dfa9ba8 194f98bcc4d0 194f98bcc4d0 834233cd72a9 e3ec12814779 834233cd72a9 45aa83f854cb 1c6dc1278147 1c6dc1278147 1c6dc1278147 1c6dc1278147 1c6dc1278147 1c6dc1278147 1c6dc1278147 1c6dc1278147 1c6dc1278147 d9e433659d01 875f736d67c5 8f233c79430f 1c6dc1278147 8f233c79430f 8f233c79430f 8f233c79430f 875f736d67c5 69a65ac3ed90 1c6dc1278147 0d458bea068e d9e433659d01 1c6dc1278147 69a65ac3ed90 1c6dc1278147 | import itertools
from django.db.models import Sum
from registrasion.models import commerce
from registrasion.models import inventory
from category import CategoryController
from conditions import ConditionController
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.
TODO: refactor so that all conditions are tested here and
can_add_with_flags calls this method. '''
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))
cat_quants = dict(
(
category,
CategoryController(category).user_quantity_remaining(user),
)
for category in set(product.category for product in all_products)
)
passed_limits = set(
product
for product in all_products
if cat_quants[product.category] > 0
if cls(product).user_quantity_remaining(user) > 0
)
failed_and_messages = ConditionController.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
def user_quantity_remaining(self, user):
''' Returns the quantity of this product that the user add in the
current cart. '''
prod_limit = self.product.limit_per_user
if prod_limit is None:
# Don't need to run the remaining queries
return 999999 # We can do better
carts = commerce.Cart.objects.filter(
user=user,
active=False,
released=False,
)
items = commerce.ProductItem.objects.filter(
cart__in=carts,
product=self.product,
)
prod_count = items.aggregate(Sum("quantity"))["quantity__sum"] or 0
return prod_limit - prod_count
|