Преглед на файлове

Added stock validation to the basket forms

master
David Winterbottom преди 13 години
родител
ревизия
fdee8c4760
променени са 3 файла, в които са добавени 46 реда и са изтрити 33 реда
  1. 32
    10
      oscar/apps/basket/forms.py
  2. 11
    20
      oscar/apps/basket/views.py
  3. 3
    3
      oscar/templatetags/basket_tags.py

+ 32
- 10
oscar/apps/basket/forms.py Целия файл

@@ -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']

+ 11
- 20
oscar/apps/basket/views.py Целия файл

@@ -8,11 +8,14 @@ from django.utils.translation import ugettext_lazy as _
8 8
 from django.core.exceptions import ObjectDoesNotExist
9 9
 
10 10
 from extra_views import ModelFormSetView
11
-from oscar.apps.basket.forms import BasketLineForm, AddToBasketForm, \
12
-    BasketVoucherForm, SavedLineForm, ProductSelectionForm
13 11
 from oscar.apps.basket.signals import basket_addition
14
-from oscar.core.loading import import_module
15
-import_module('offer.utils', ['Applicator'], locals())
12
+from oscar.core.loading import get_class, get_classes
13
+Applicator = get_class('offer.utils', 'Applicator')
14
+BasketLineForm, AddToBasketForm, BasketVoucherForm, \
15
+        SavedLineForm, ProductSelectionForm = get_classes(
16
+            'basket.forms', ('BasketLineForm', 'AddToBasketForm',
17
+                             'BasketVoucherForm', 'SavedLineForm',
18
+                             'ProductSelectionForm'))
16 19
 
17 20
 
18 21
 class BasketView(ModelFormSetView):
@@ -56,6 +59,8 @@ class BasketView(ModelFormSetView):
56 59
                     needs_auth = True
57 60
         if needs_auth:
58 61
             messages.error(self.request, "You can't save an item for later if you're not logged in!")
62
+        else:
63
+            messages.success(self.request, _("Basket updated"))
59 64
         return super(BasketView, self).formset_valid(formset)
60 65
 
61 66
     def move_line_to_saved_basket(self, line):
@@ -88,6 +93,7 @@ class BasketAddView(FormView):
88 93
             kwargs['instance'] = product_select_form.cleaned_data['product_id']
89 94
         else:
90 95
             raise Http404()
96
+        kwargs['user'] = self.request.user
91 97
         kwargs['basket'] = self.request.basket
92 98
         return kwargs
93 99
 
@@ -226,19 +232,4 @@ class SavedView(ModelFormSetView):
226 232
         return super(SavedView, self).formset_valid(formset)
227 233
 
228 234
     def formset_invalid(self, formset):
229
-        return HttpResponseRedirect(self.request.META.get('HTTP_REFERER', reverse('basket:summary')))
230
-
231
-
232
-
233
-#    def do_bulk_load(self, basket):
234
-#        num_additions = 0
235
-#        num_not_found = 0
236
-#        for sku in re.findall(r"[\d -]{5,}", self.request.POST['source_text']):
237
-#            try:
238
-#                item = Product.objects.get(upc=sku)
239
-#                basket.add_product(item)
240
-#                num_additions += 1
241
-#            except Product.DoesNotExist:
242
-#                num_not_found += 1
243
-#        messages.info(self.request, "Added %d items to your basket (%d missing)" % (num_additions, num_not_found))
244
-#
235
+        return HttpResponseRedirect(self.request.META.get('HTTP_REFERER', reverse('basket:summary')))

+ 3
- 3
oscar/templatetags/basket_tags.py Целия файл

@@ -1,8 +1,8 @@
1 1
 from django import template
2 2
 from django.db.models import get_model
3 3
 
4
-from oscar.core.loading import import_module
5
-forms = import_module('basket.forms', ['AddToBasketForm'])
4
+from oscar.core.loading import get_class
5
+AddToBasketForm = get_class('basket.forms', 'AddToBasketForm')
6 6
 Product = get_model('catalogue', 'product')
7 7
 
8 8
 register = template.Library()
@@ -39,5 +39,5 @@ class BasketFormNode(template.Node):
39 39
             initial = {
40 40
                 'product_id': product.id,
41 41
             }
42
-            context[self.form_var] = forms.AddToBasketForm(basket, instance=product,initial=initial)
42
+            context[self.form_var] = AddToBasketForm(basket, user=None, instance=product,initial=initial)
43 43
         return ''

Loading…
Отказ
Запис