Merge branch 'ui_sanitisation'
This commit is contained in:
commit
77b6c87973
6 changed files with 110 additions and 5 deletions
24
registrasion/controllers/category.py
Normal file
24
registrasion/controllers/category.py
Normal 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)
|
|
@ -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
|
||||||
|
|
|
@ -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)
|
||||||
|
|
|
@ -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)
|
||||||
|
|
|
@ -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)
|
||||||
|
|
|
@ -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 = {
|
||||||
|
|
Loading…
Reference in a new issue