Files @ 4d134e95d70b
Branch filter:

Location: symposion_app/registrasion/controllers/category.py

Christopher Neugebauer
Refactors discount ceiling testing to make sure that the discount ceiling only considers items where the discount was applied in determining if the discount was reached.
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
        
        cat_limit = self.category.limit_per_user

        if cat_limit is None:
            return 999999  # We should probably work on this.
        else:
            return cat_limit - cat_count