Browse Source

Template tags calls form permission

This commit will make the templatetags to pull the form rendering
permission from the form object.

Also there will be two attributes set in the form when redering
purchase_permitted, and reason. This will allow a better information to
be displayed on the template.
master
andrefsp 13 years ago
parent
commit
72c3d7cf4a

+ 6
- 5
oscar/apps/basket/forms.py View File

@@ -127,9 +127,9 @@ class AddToBasketForm(forms.Form):
127 127
             else:
128 128
                 self._create_product_fields(instance)
129 129
 
130
-    def is_allowed_to_purchase(self, product, desired_qty):
131
-        return product.is_purchase_permitted(user=self.request.user,
132
-                                                quantity=desired_qty)
130
+
131
+    def is_purchase_permitted(self, user, product, desired_qty):
132
+        return product.is_purchase_permitted(user=user, quantity=desired_qty)
133 133
 
134 134
     def cleaned_options(self):
135 135
         """
@@ -156,9 +156,10 @@ class AddToBasketForm(forms.Form):
156 156
                                                 self.cleaned_options())
157 157
         desired_qty = current_qty + self.cleaned_data.get('quantity', 1)
158 158
 
159
-        is_available, reason = self.is_allowed_to_purchase(product, desired_qty)
159
+        is_permitted, reason = self.is_purchase_permitted(self.request.user,
160
+                                                    product, desired_qty)
160 161
 
161
-        if not is_available:
162
+        if not is_permitted:
162 163
             raise forms.ValidationError(reason)
163 164
         return self.cleaned_data
164 165
 

+ 4
- 0
oscar/templates/oscar/catalogue/partials/add_to_basket_form.html View File

@@ -3,6 +3,7 @@
3 3
 
4 4
 {% if product.is_available_to_buy %}
5 5
     {% basket_form request product as basket_form %}
6
+    {% if basket_form.purchase_permitted %}
6 7
     <form action="{% url basket:add %}" method="post" class="form-stacked">
7 8
         {% csrf_token %}
8 9
         {% include "partials/form_fields.html" with form=basket_form %}
@@ -10,6 +11,9 @@
10 11
 			<button type="submit" class="btn btn-large btn-primary btn-full" value="Add to basket">{% trans "Add to basket" %}</button>
11 12
         </div>
12 13
     </form>
14
+    {% else %}
15
+        {{ basket_form.reason }}
16
+    {% endif %}
13 17
 {% else %}
14 18
 	{% if has_active_alert %}
15 19
 	<p>{% trans "You have an active stock alert for this product." %}</p>

+ 5
- 0
oscar/templates/oscar/catalogue/partials/add_to_basket_form_compact.html View File

@@ -2,6 +2,8 @@
2 2
 {% load i18n %}
3 3
 
4 4
 {% basket_form request product as basket_form single %}
5
+
6
+{% if basket_form.purchase_permitted %}
5 7
 <form action="{% url basket:add %}" method="post">
6 8
     {% csrf_token %}
7 9
     {{ basket_form.as_p }}
@@ -9,3 +11,6 @@
9 11
         <button type="submit" class="btn btn-primary btn-full">{% trans "Add to basket" %}</button>
10 12
     {% endif %}
11 13
 </form>
14
+{% else %}
15
+    {{ basket_form.reason }}
16
+{% endif %}

+ 14
- 5
oscar/templatetags/basket_tags.py View File

@@ -24,14 +24,14 @@ def do_basket_form(parse, token):
24 24
             "{%% basket_form request product_var as "
25 25
             "form_var %%}" % tokens[0])
26 26
 
27
-    request, product_var, form_var = tokens[1], tokens[2], tokens[4]
27
+    request_var, product_var, form_var = tokens[1], tokens[2], tokens[4]
28 28
 
29 29
     quantity_type = tokens[5] if len(tokens) == 6 else QNT_MULTIPLE
30 30
     if quantity_type not in (QNT_SINGLE, QNT_MULTIPLE):
31 31
         raise template.TemplateSyntaxError(
32 32
             "%r tag only accepts the following quantity types: "
33 33
             "'single', 'multiple'" % tokens[0])
34
-    return BasketFormNode(request, product_var, form_var, quantity_type)
34
+    return BasketFormNode(request_var, product_var, form_var, quantity_type)
35 35
 
36 36
 
37 37
 class BasketFormNode(template.Node):
@@ -44,7 +44,7 @@ class BasketFormNode(template.Node):
44 44
 
45 45
     def render(self, context):
46 46
         try:
47
-            request = self.request_var.resolve(context)
47
+            self.request = self.request_var.resolve(context)
48 48
             product = self.product_var.resolve(context)
49 49
         except template.VariableDoesNotExist:
50 50
             return ''
@@ -53,6 +53,15 @@ class BasketFormNode(template.Node):
53 53
             initial = {}
54 54
             if not product.is_group:
55 55
                 initial['product_id'] = product.id
56
-            context[self.form_var] = self.form_class(
57
-                request, instance=product, initial=initial)
56
+            self.form = self.form_class(
57
+                self.request, instance=product, initial=initial)
58
+
59
+            user = self.request.user
60
+            is_permitted, reason = self.form.is_purchase_permitted(user,
61
+                                                                product, 1)
62
+
63
+            self.form.purchase_permitted = is_permitted
64
+            self.form.reason = reason
65
+
66
+            context[self.form_var] = self.form
58 67
         return ''

Loading…
Cancel
Save