Merge branch 'ui_sanitisation'

This commit is contained in:
Christopher Neugebauer 2016-04-02 13:28:46 +11:00
commit 77b6c87973
6 changed files with 110 additions and 5 deletions

View file

@ -0,0 +1,24 @@
from .product import ProductController
from registrasion import models as rego
class AllProducts(object):
pass
class CategoryController(object):
@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. '''
if products is AllProducts:
products = rego.Product.objects.all()
available = ProductController.available_products(
user,
products=products,
)
return set(i.category for i in available)

View file

@ -32,16 +32,23 @@ class ProductController(object):
out = [ out = [
product product
for product in all_products for product in all_products
if cls(product).user_can_add_within_limit(user, 1, past_carts=True)
if cls(product).can_add_with_enabling_conditions(user, 0) if cls(product).can_add_with_enabling_conditions(user, 0)
] ]
out.sort(key=lambda product: product.order) out.sort(key=lambda product: product.order)
return out return out
def user_can_add_within_limit(self, user, quantity): def user_can_add_within_limit(self, user, quantity, past_carts=False):
''' Return true if the user is able to add _quantity_ to their count of ''' Return true if the user is able to add _quantity_ to their count of
this Product without exceeding _limit_per_user_.''' this Product without exceeding _limit_per_user_.'''
carts = rego.Cart.objects.filter(user=user) carts = rego.Cart.objects.filter(
user=user,
released=False,
)
if past_carts:
carts = carts.filter(active=False)
items = rego.ProductItem.objects.filter( items = rego.ProductItem.objects.filter(
cart__in=carts, cart__in=carts,
) )
@ -52,9 +59,9 @@ class ProductController(object):
prod_count = prod_items.aggregate(Sum("quantity"))["quantity__sum"] prod_count = prod_items.aggregate(Sum("quantity"))["quantity__sum"]
cat_count = cat_items.aggregate(Sum("quantity"))["quantity__sum"] cat_count = cat_items.aggregate(Sum("quantity"))["quantity__sum"]
if prod_count == None: if prod_count is None:
prod_count = 0 prod_count = 0
if cat_count == None: if cat_count is None:
cat_count = 0 cat_count = 0
prod_limit = self.product.limit_per_user prod_limit = self.product.limit_per_user

View file

@ -1,4 +1,5 @@
from registrasion import models as rego from registrasion import models as rego
from registrasion.controllers.category import CategoryController
from collections import namedtuple from collections import namedtuple
from django import template from django import template
@ -12,7 +13,7 @@ ProductAndQuantity = namedtuple("ProductAndQuantity", ["product", "quantity"])
@register.assignment_tag(takes_context=True) @register.assignment_tag(takes_context=True)
def available_categories(context): def available_categories(context):
''' Returns all of the available product categories ''' ''' Returns all of the available product categories '''
return rego.Category.objects.all() return CategoryController.available_categories(context.request.user)
@register.assignment_tag(takes_context=True) @register.assignment_tag(takes_context=True)

View file

@ -9,6 +9,7 @@ from django.test import TestCase
from registrasion import models as rego from registrasion import models as rego
from registrasion.controllers.cart import CartController from registrasion.controllers.cart import CartController
from registrasion.controllers.product import ProductController
from patch_datetime import SetTimeMixin from patch_datetime import SetTimeMixin
@ -288,3 +289,31 @@ class BasicCartTests(RegistrationCartTestCase):
with self.assertRaises(ValidationError): with self.assertRaises(ValidationError):
current_cart.set_quantity(self.PROD_4, 1) current_cart.set_quantity(self.PROD_4, 1)
def __available_products_test(self, item, quantity):
self.set_limits()
get_prods = lambda: ProductController.available_products(
self.USER_1,
products=[self.PROD_2, self.PROD_3, self.PROD_4],
)
current_cart = CartController.for_user(self.USER_1)
prods = get_prods()
self.assertTrue(item in prods)
current_cart.add_to_cart(item, quantity)
self.assertTrue(item in prods)
current_cart.cart.active = False
current_cart.cart.save()
current_cart = CartController.for_user(self.USER_1)
prods = get_prods()
self.assertTrue(item not in prods)
def test_available_products_respects_category_limits(self):
self.__available_products_test(self.PROD_3, 10)
def test_available_products_respects_product_limits(self):
self.__available_products_test(self.PROD_4, 6)

View file

@ -3,6 +3,7 @@ import pytz
from django.core.exceptions import ValidationError from django.core.exceptions import ValidationError
from registrasion import models as rego from registrasion import models as rego
from registrasion.controllers.category import CategoryController
from registrasion.controllers.cart import CartController from registrasion.controllers.cart import CartController
from registrasion.controllers.product import ProductController from registrasion.controllers.product import ProductController
@ -271,3 +272,24 @@ class EnablingConditionTestCases(RegistrationCartTestCase):
with self.assertRaises(ValidationError): with self.assertRaises(ValidationError):
cart_2.set_quantity(self.PROD_1, 1) cart_2.set_quantity(self.PROD_1, 1)
def test_available_categories(self):
self.add_product_enabling_condition_on_category(mandatory=False)
cart_1 = CartController.for_user(self.USER_1)
cats = CategoryController.available_categories(
self.USER_1,
)
self.assertFalse(self.CAT_1 in cats)
self.assertTrue(self.CAT_2 in cats)
cart_1.add_to_cart(self.PROD_3, 1)
cats = CategoryController.available_categories(
self.USER_1,
)
self.assertTrue(self.CAT_1 in cats)
self.assertTrue(self.CAT_2 in cats)

View file

@ -121,6 +121,10 @@ def guided_registration(request, page_id=0):
category=category, category=category,
) )
if not products:
# This product category does not exist for this user
continue
prefix = "category_" + str(category.id) prefix = "category_" + str(category.id)
p = handle_products(request, category, products, prefix) p = handle_products(request, category, products, prefix)
products_form, discounts, products_handled = p products_form, discounts, products_handled = p
@ -160,6 +164,13 @@ def guided_registration(request, page_id=0):
def edit_profile(request): def edit_profile(request):
form, handled = handle_profile(request, "profile") form, handled = handle_profile(request, "profile")
if handled and not form.errors:
messages.success(
request,
"Your attendee profile was updated.",
)
return redirect("dashboard")
data = { data = {
"form": form, "form": form,
} }
@ -229,12 +240,23 @@ def product_category(request, category_id):
category=category, category=category,
) )
if not products:
messages.warning(
request,
"There are no products available from category: "+ category.name,
)
return redirect("dashboard")
p = handle_products(request, category, products, PRODUCTS_FORM_PREFIX) p = handle_products(request, category, products, PRODUCTS_FORM_PREFIX)
products_form, discounts, products_handled = p products_form, discounts, products_handled = p
if request.POST and not voucher_handled and not products_form.errors: if request.POST and not voucher_handled and not products_form.errors:
# Only return to the dashboard if we didn't add a voucher code # Only return to the dashboard if we didn't add a voucher code
# and if there's no errors in the products form # and if there's no errors in the products form
messages.success(
request,
"Your reservations have been updated.",
)
return redirect("dashboard") return redirect("dashboard")
data = { data = {