@@ -7,12 +7,13 @@ from django.core.exceptions import ObjectDoesNotExist
from django.core.exceptions import ValidationError
from django.db import transaction
from django.db.models import Max
from django.utils import timezone
from registrasion import models as rego
from registrasion.exceptions import CartValidationError
from category import CategoryController
from conditions import ConditionController
from product import ProductController
@@ -111,59 +112,68 @@ class CartController(object):
self.end_batch()
def _test_limits(self, product_quantities):
''' Tests that the quantity changes we intend to make do not violate
the limits and enabling conditions imposed on the products. '''
errors = []
# Test each product limit here
for product, quantity in product_quantities:
if quantity < 0:
# TODO: batch errors
raise ValidationError("Value must be zero or greater.")
errors.append((product, "Value must be zero or greater."))
prod = ProductController(product)
limit = prod.user_quantity_remaining(self.cart.user)
if quantity > limit:
raise ValidationError(
errors.append((
product,
"You may only have %d of product: %s" % (
limit, product.name,
limit, product,
)
))
# Collect by category
by_cat = collections.defaultdict(list)
by_cat[product.category].append((product, quantity))
# Test each category limit here
for cat in by_cat:
ctrl = CategoryController(cat)
for category in by_cat:
ctrl = CategoryController(category)
limit = ctrl.user_quantity_remaining(self.cart.user)
# Get the amount so far in the cart
to_add = sum(i[1] for i in by_cat[cat])
to_add = sum(i[1] for i in by_cat[category])
if to_add > limit:
category,
"You may only have %d items in category: %s" % (
limit, cat.name,
limit, category.name,
# Test the enabling conditions
errs = ConditionController.test_enabling_conditions(
self.cart.user,
product_quantities=product_quantities,
if errs:
raise ValidationError("An enabling condition failed")
errors.append(
("enabling_conditions", "An enabling condition failed")
if errors:
raise CartValidationError(errors)
def apply_voucher(self, voucher_code):
''' Applies the voucher with the given code to this cart. '''
# Is voucher exhausted?
active_carts = rego.Cart.reserved_carts()