Files
@ c4c8a7ab8296
Branch filter:
Location: symposion_app/registrasion/controllers/product.py - annotation
c4c8a7ab8296
2.5 KiB
text/x-python
Tidies up the admin interface for flags
45aa83f854cb 45aa83f854cb 0d458bea068e d9e433659d01 d9e433659d01 576dddcaad19 d9e433659d01 d9e433659d01 d9e433659d01 d9e433659d01 d9e433659d01 d9e433659d01 d9e433659d01 d9e433659d01 45aa83f854cb 45aa83f854cb 45aa83f854cb 45aa83f854cb 45aa83f854cb 45aa83f854cb 45aa83f854cb 45aa83f854cb 45aa83f854cb 45aa83f854cb 45aa83f854cb 53413388e016 45aa83f854cb 45aa83f854cb 45aa83f854cb 45aa83f854cb 53413388e016 53413388e016 53413388e016 53413388e016 53413388e016 53413388e016 53413388e016 53413388e016 53413388e016 45aa83f854cb 194f98bcc4d0 45aa83f854cb 45aa83f854cb 53413388e016 1c6dc1278147 194f98bcc4d0 194f98bcc4d0 cc318dfa9ba8 194f98bcc4d0 cc318dfa9ba8 cc318dfa9ba8 194f98bcc4d0 194f98bcc4d0 834233cd72a9 e3ec12814779 834233cd72a9 45aa83f854cb 1c6dc1278147 1c6dc1278147 1c6dc1278147 1c6dc1278147 1c6dc1278147 1c6dc1278147 1c6dc1278147 1c6dc1278147 1c6dc1278147 d9e433659d01 8f233c79430f 8f233c79430f 1c6dc1278147 8f233c79430f 8f233c79430f 8f233c79430f 224878a10ce3 69a65ac3ed90 1c6dc1278147 0d458bea068e d9e433659d01 1c6dc1278147 69a65ac3ed90 1c6dc1278147 | import itertools
from django.db.models import Sum
from registrasion import models as rego
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
enabling conditions from the given categories.
TODO: refactor so that all conditions are tested here and
can_add_with_enabling_conditions 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 = rego.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_enabling_conditions(
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 = rego.Cart.objects.filter(
user=user,
active=False,
released=False,
)
items = rego.ProductItem.objects.filter(
cart__in=carts,
product=self.product,
)
prod_count = items.aggregate(Sum("quantity"))["quantity__sum"] or 0
return prod_limit - prod_count
|