Changeset - a4d684f444e7
[Not reviewed]
0 3 1
Christopher Neugebauer - 8 years ago 2016-04-03 05:25:39
chrisjrn@gmail.com
Raises limits errors in the right parts of the form
4 files changed with 39 insertions and 15 deletions:
0 comments (0 inline, 0 general)
registrasion/controllers/cart.py
Show inline comments
...
 
@@ -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. '''
registrasion/controllers/category.py
Show inline comments
...
 
@@ -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
registrasion/exceptions.py
Show inline comments
 
new file 100644
 
from django.core.exceptions import ValidationError
 

	
 
class CartValidationError(ValidationError):
 
    pass
registrasion/views.py
Show inline comments
...
 
@@ -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):
0 comments (0 inline, 0 general)