|
|
@@ -3,8 +3,8 @@ from django.conf import settings
|
|
3
|
3
|
from django.db.models import get_model
|
|
4
|
4
|
from django.utils.translation import gettext_lazy as _
|
|
5
|
5
|
|
|
6
|
|
-basketline_model = get_model('basket', 'line')
|
|
7
|
|
-basket_model = get_model('basket', 'basket')
|
|
|
6
|
+Line = get_model('basket', 'line')
|
|
|
7
|
+Basket = get_model('basket', 'basket')
|
|
8
|
8
|
Product = get_model('catalogue', 'product')
|
|
9
|
9
|
|
|
10
|
10
|
|
|
|
@@ -13,6 +13,11 @@ class BasketLineForm(forms.ModelForm):
|
|
13
|
13
|
|
|
14
|
14
|
def clean_quantity(self):
|
|
15
|
15
|
qty = self.cleaned_data['quantity']
|
|
|
16
|
+ self.check_max_allowed_quantity(qty)
|
|
|
17
|
+ self.check_permission(qty)
|
|
|
18
|
+ return qty
|
|
|
19
|
+
|
|
|
20
|
+ def check_max_allowed_quantity(self, qty):
|
|
16
|
21
|
basket_threshold = settings.OSCAR_MAX_BASKET_QUANTITY_THRESHOLD
|
|
17
|
22
|
if basket_threshold:
|
|
18
|
23
|
total_basket_quantity = self.instance.basket.num_items
|
|
|
@@ -25,10 +30,16 @@ class BasketLineForm(forms.ModelForm):
|
|
25
|
30
|
'threshold': basket_threshold,
|
|
26
|
31
|
'basket': total_basket_quantity,
|
|
27
|
32
|
})
|
|
28
|
|
- return qty
|
|
|
33
|
+
|
|
|
34
|
+ def check_permission(self, qty):
|
|
|
35
|
+ product = self.instance.product
|
|
|
36
|
+ is_available, reason = product.is_purchase_permitted(user=None,
|
|
|
37
|
+ quantity=qty)
|
|
|
38
|
+ if not is_available:
|
|
|
39
|
+ raise forms.ValidationError(reason)
|
|
29
|
40
|
|
|
30
|
41
|
class Meta:
|
|
31
|
|
- model = basketline_model
|
|
|
42
|
+ model = Line
|
|
32
|
43
|
exclude = ('basket', 'product', 'line_reference', )
|
|
33
|
44
|
|
|
34
|
45
|
|
|
|
@@ -36,7 +47,7 @@ class SavedLineForm(forms.ModelForm):
|
|
36
|
47
|
move_to_basket = forms.BooleanField(initial=False, required=False)
|
|
37
|
48
|
|
|
38
|
49
|
class Meta:
|
|
39
|
|
- model = basketline_model
|
|
|
50
|
+ model = Line
|
|
40
|
51
|
exclude = ('basket', 'product', 'line_reference', 'quantity', )
|
|
41
|
52
|
|
|
42
|
53
|
|
|
|
@@ -63,9 +74,10 @@ class AddToBasketForm(forms.Form):
|
|
63
|
74
|
product_id = forms.IntegerField(widget=forms.HiddenInput(), min_value=1)
|
|
64
|
75
|
quantity = forms.IntegerField(initial=1, min_value=1)
|
|
65
|
76
|
|
|
66
|
|
- def __init__(self, basket, instance, *args, **kwargs):
|
|
|
77
|
+ def __init__(self, basket, user, instance, *args, **kwargs):
|
|
67
|
78
|
super(AddToBasketForm, self).__init__(*args, **kwargs)
|
|
68
|
79
|
self.basket = basket
|
|
|
80
|
+ self.user = user
|
|
69
|
81
|
self.instance = instance
|
|
70
|
82
|
if instance:
|
|
71
|
83
|
if instance.is_group:
|
|
|
@@ -73,12 +85,22 @@ class AddToBasketForm(forms.Form):
|
|
73
|
85
|
else:
|
|
74
|
86
|
self._create_product_fields(instance)
|
|
75
|
87
|
|
|
76
|
|
- def clean_product_id(self):
|
|
|
88
|
+ def clean(self):
|
|
77
|
89
|
id = self.cleaned_data['product_id']
|
|
78
|
90
|
product = Product.objects.get(id=id)
|
|
79
|
|
- if not product.has_stockrecord or not product.stockrecord.is_available_to_buy:
|
|
80
|
|
- raise forms.ValidationError(_("This product is not available for purchase"))
|
|
81
|
|
- return id
|
|
|
91
|
+ qty = self.cleaned_data.get('quantity', 1)
|
|
|
92
|
+ try:
|
|
|
93
|
+ line = self.basket.lines.get(product=product)
|
|
|
94
|
+ except Line.DoesNotExist:
|
|
|
95
|
+ desired_qty = qty
|
|
|
96
|
+ else:
|
|
|
97
|
+ desired_qty = qty + line.quantity
|
|
|
98
|
+
|
|
|
99
|
+ is_available, reason = product.is_purchase_permitted(user=self.user,
|
|
|
100
|
+ quantity=desired_qty)
|
|
|
101
|
+ if not is_available:
|
|
|
102
|
+ raise forms.ValidationError(reason)
|
|
|
103
|
+ return self.cleaned_data
|
|
82
|
104
|
|
|
83
|
105
|
def clean_quantity(self):
|
|
84
|
106
|
qty = self.cleaned_data['quantity']
|