Files @ a4d684f444e7
Branch filter:

Location: symposion_app/registrasion/controllers/category.py

Christopher Neugebauer
Raises limits errors in the right parts of the form
from registrasion import models as rego

from django.db.models import Sum


class AllProducts(object):
    pass


class CategoryController(object):

    def __init__(self, category):
        self.category = category

    @classmethod
    def available_categories(cls, user, products=AllProducts):
        ''' Returns the categories available to the user. Specify `products` if
        you want to restrict to just the categories that hold the specified
        products, otherwise it'll do all. '''

        # STOPGAP -- this needs to be elsewhere tbqh
        from product import ProductController

        if products is AllProducts:
            products = rego.Product.objects.all()

        available = ProductController.available_products(
            user,
            products=products,
        )

        return set(i.category for i in available)

    def user_quantity_remaining(self, user):
        ''' Returns the number of items from this category that the user may
        add in the current cart. '''

        cat_limit = self.category.limit_per_user

        if cat_limit is None:
            # We don't need to waste the following queries
            return 99999999

        carts = rego.Cart.objects.filter(
            user=user,
            active=False,
            released=False,
        )

        items = rego.ProductItem.objects.filter(
            cart__in=carts,
            product__category=self.category,
        )

        cat_count = items.aggregate(Sum("quantity"))["quantity__sum"] or 0
        return cat_limit - cat_count