Raises limits errors in the right parts of the form

This commit is contained in:
Christopher Neugebauer 2016-04-03 15:25:39 +10:00
parent 7609965883
commit a4d684f444
4 changed files with 39 additions and 15 deletions

View file

@ -10,6 +10,7 @@ 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
@ -114,22 +115,25 @@ class CartController(object):
''' 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:
# TODO: batch errors
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)
@ -137,20 +141,21 @@ class CartController(object):
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:
# TODO: batch errors
raise ValidationError(
errors.append((
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(
@ -160,7 +165,12 @@ class CartController(object):
if errs:
# TODO: batch errors
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. '''

View file

@ -53,4 +53,4 @@ class CategoryController(object):
)
cat_count = items.aggregate(Sum("quantity"))["quantity__sum"] or 0
cat_limit - cat_count
return cat_limit - cat_count

View file

@ -0,0 +1,4 @@
from django.core.exceptions import ValidationError
class CartValidationError(ValidationError):
pass

View file

@ -6,6 +6,7 @@ from registrasion.controllers import discount
from registrasion.controllers.cart import CartController
from registrasion.controllers.invoice import InvoiceController
from registrasion.controllers.product import ProductController
from registrasion.exceptions import CartValidationError
from collections import namedtuple
@ -321,15 +322,24 @@ def handle_products(request, category, products, prefix):
def set_quantities_from_products_form(products_form, current_cart):
quantities = products_form.product_quantities()
quantities = list(products_form.product_quantities())
product_quantities = [
(rego.Product.objects.get(pk=i[0]), i[1]) for i in quantities
]
field_names = dict(
(i[0][0], i[1][2]) for i in zip(product_quantities, quantities)
)
try:
current_cart.set_quantities(product_quantities)
except ValidationError as ve:
products_form.add_error(None, ve)
except CartValidationError as ve:
for ve_field in ve.error_list:
product, message = ve_field.message
if product in field_names:
field = field_names[product]
else:
field = None
products_form.add_error(field, message)
def handle_voucher(request, prefix):