|
|
@@ -22,14 +22,14 @@ class BasketView(ModelFormSetView):
|
|
22
|
22
|
extra = 0
|
|
23
|
23
|
can_delete = True
|
|
24
|
24
|
template_name='basket/basket.html'
|
|
25
|
|
-
|
|
|
25
|
+
|
|
26
|
26
|
def get_queryset(self):
|
|
27
|
27
|
return self.request.basket.lines.all()
|
|
28
|
|
-
|
|
|
28
|
+
|
|
29
|
29
|
def get_context_data(self, **kwargs):
|
|
30
|
30
|
context = super(BasketView, self).get_context_data(**kwargs)
|
|
31
|
31
|
context['voucher_form'] = BasketVoucherForm()
|
|
32
|
|
-
|
|
|
32
|
+
|
|
33
|
33
|
if self.request.user.is_authenticated():
|
|
34
|
34
|
try:
|
|
35
|
35
|
saved_basket = self.basket_model.saved.get(owner=self.request.user)
|
|
|
@@ -40,7 +40,7 @@ class BasketView(ModelFormSetView):
|
|
40
|
40
|
except self.basket_model.DoesNotExist:
|
|
41
|
41
|
pass
|
|
42
|
42
|
return context
|
|
43
|
|
-
|
|
|
43
|
+
|
|
44
|
44
|
def get_success_url(self):
|
|
45
|
45
|
return self.request.META.get('HTTP_REFERER', reverse('basket:summary'))
|
|
46
|
46
|
|
|
|
@@ -51,11 +51,11 @@ class BasketView(ModelFormSetView):
|
|
51
|
51
|
line = form.instance
|
|
52
|
52
|
if self.request.user.is_authenticated():
|
|
53
|
53
|
self.move_line_to_saved_basket(line)
|
|
54
|
|
- messages.info(self.request, _(u"'%(title)s' has been saved for later" % {'title': line.product}))
|
|
|
54
|
+ messages.info(self.request, _(u"'%(title)s' has been saved for later" % {'title': line.product}))
|
|
55
|
55
|
else:
|
|
56
|
56
|
needs_auth = True
|
|
57
|
57
|
if needs_auth:
|
|
58
|
|
- messages.error(self.request, "You can't save an item for later if you're not logged in!")
|
|
|
58
|
+ messages.error(self.request, "You can't save an item for later if you're not logged in!")
|
|
59
|
59
|
return super(BasketView, self).formset_valid(formset)
|
|
60
|
60
|
|
|
61
|
61
|
def move_line_to_saved_basket(self, line):
|
|
|
@@ -69,27 +69,28 @@ class BasketView(ModelFormSetView):
|
|
69
|
69
|
|
|
70
|
70
|
class BasketAddView(FormView):
|
|
71
|
71
|
"""
|
|
72
|
|
- Handles the add-to-basket operation, shouldn't be accessed via
|
|
|
72
|
+ Handles the add-to-basket operation, shouldn't be accessed via
|
|
73
|
73
|
GET because there's nothing sensible to render.
|
|
74
|
74
|
"""
|
|
75
|
75
|
form_class = AddToBasketForm
|
|
76
|
76
|
product_select_form_class = ProductSelectionForm
|
|
77
|
77
|
product_model = get_model('catalogue', 'product')
|
|
78
|
78
|
add_signal = basket_addition
|
|
79
|
|
-
|
|
|
79
|
+
|
|
80
|
80
|
def get(self, request, *args, **kwargs):
|
|
81
|
81
|
return HttpResponseRedirect(reverse('basket:summary'))
|
|
82
|
|
-
|
|
83
|
|
- def get_form_kwargs(self):
|
|
|
82
|
+
|
|
|
83
|
+ def get_form_kwargs(self):
|
|
84
|
84
|
kwargs = super(BasketAddView, self).get_form_kwargs()
|
|
85
|
85
|
product_select_form = self.product_select_form_class(self.request.POST)
|
|
86
|
86
|
|
|
87
|
87
|
if product_select_form.is_valid():
|
|
88
|
88
|
kwargs['instance'] = product_select_form.cleaned_data['product_id']
|
|
89
|
89
|
else:
|
|
90
|
|
- raise Http404()
|
|
|
90
|
+ raise Http404()
|
|
|
91
|
+ kwargs['basket'] = self.request.basket
|
|
91
|
92
|
return kwargs
|
|
92
|
|
-
|
|
|
93
|
+
|
|
93
|
94
|
def get_success_url(self):
|
|
94
|
95
|
return self.request.META.get('HTTP_REFERER', reverse('basket:summary'))
|
|
95
|
96
|
|
|
|
@@ -100,18 +101,18 @@ class BasketAddView(FormView):
|
|
100
|
101
|
options.append({'option': option, 'value': form.cleaned_data[option.code]})
|
|
101
|
102
|
self.request.basket.add_product(form.instance, form.cleaned_data['quantity'], options)
|
|
102
|
103
|
messages.info(self.request, _(u"'%(title)s' (quantity %(quantity)d) has been added to your basket" %
|
|
103
|
|
- {'title': form.instance.get_title(),
|
|
|
104
|
+ {'title': form.instance.get_title(),
|
|
104
|
105
|
'quantity': form.cleaned_data['quantity']}))
|
|
105
|
|
-
|
|
|
106
|
+
|
|
106
|
107
|
# Send signal for basket addition
|
|
107
|
108
|
self.add_signal.send(sender=self, product=form.instance, user=self.request.user)
|
|
108
|
|
-
|
|
|
109
|
+
|
|
109
|
110
|
return super(BasketAddView, self).form_valid(form)
|
|
110
|
|
-
|
|
|
111
|
+
|
|
111
|
112
|
def form_invalid(self, form):
|
|
112
|
113
|
msgs = []
|
|
113
|
114
|
for error in form.errors.values():
|
|
114
|
|
- msgs.append(error.as_text())
|
|
|
115
|
+ msgs.append(error.as_text())
|
|
115
|
116
|
messages.error(self.request, ",".join(msgs))
|
|
116
|
117
|
return HttpResponseRedirect(self.request.META.get('HTTP_REFERER',reverse('basket:summary')))
|
|
117
|
118
|
|
|
|
@@ -120,7 +121,7 @@ class VoucherView(ListView):
|
|
120
|
121
|
model = get_model('voucher', 'voucher')
|
|
121
|
122
|
can_delete = True
|
|
122
|
123
|
extra = 0
|
|
123
|
|
-
|
|
|
124
|
+
|
|
124
|
125
|
def get_queryset(self):
|
|
125
|
126
|
self.request.basket.vouchers.all()
|
|
126
|
127
|
|
|
|
@@ -128,28 +129,28 @@ class VoucherView(ListView):
|
|
128
|
129
|
class VoucherAddView(FormView):
|
|
129
|
130
|
form_class = BasketVoucherForm
|
|
130
|
131
|
voucher_model = get_model('voucher', 'voucher')
|
|
131
|
|
-
|
|
|
132
|
+
|
|
132
|
133
|
def get(self, request, *args, **kwargs):
|
|
133
|
134
|
return HttpResponseRedirect(reverse('basket:summary'))
|
|
134
|
|
-
|
|
|
135
|
+
|
|
135
|
136
|
def apply_voucher_to_basket(self, voucher):
|
|
136
|
137
|
if not voucher.is_active():
|
|
137
|
138
|
messages.error(self.request, _("The '%(code)s' voucher has expired" % {'code': voucher.code}))
|
|
138
|
139
|
return
|
|
139
|
|
-
|
|
|
140
|
+
|
|
140
|
141
|
is_available, message = voucher.is_available_to_user(self.request.user)
|
|
141
|
142
|
if not is_available:
|
|
142
|
143
|
messages.error(self.request, message)
|
|
143
|
144
|
return
|
|
144
|
|
-
|
|
|
145
|
+
|
|
145
|
146
|
self.request.basket.vouchers.add(voucher)
|
|
146
|
|
-
|
|
|
147
|
+
|
|
147
|
148
|
# Recalculate discounts to see if the voucher gives any
|
|
148
|
149
|
discounts_before = self.request.basket.get_discounts()
|
|
149
|
150
|
self.request.basket.remove_discounts()
|
|
150
|
151
|
Applicator().apply(self.request, self.request.basket)
|
|
151
|
152
|
discounts_after = self.request.basket.get_discounts()
|
|
152
|
|
-
|
|
|
153
|
+
|
|
153
|
154
|
# Look for discounts from this new voucher
|
|
154
|
155
|
found_discount = False
|
|
155
|
156
|
for discount in discounts_after:
|
|
|
@@ -161,7 +162,7 @@ class VoucherAddView(FormView):
|
|
161
|
162
|
self.request.basket.vouchers.remove(voucher)
|
|
162
|
163
|
else:
|
|
163
|
164
|
messages.info(self.request, _("Voucher '%(code)s' added to basket" % {'code': voucher.code}))
|
|
164
|
|
-
|
|
|
165
|
+
|
|
165
|
166
|
def form_valid(self, form):
|
|
166
|
167
|
code = form.cleaned_data['code']
|
|
167
|
168
|
if not self.request.basket.id:
|
|
|
@@ -173,20 +174,20 @@ class VoucherAddView(FormView):
|
|
173
|
174
|
voucher = self.voucher_model._default_manager.get(code=code)
|
|
174
|
175
|
except self.voucher_model.DoesNotExist:
|
|
175
|
176
|
messages.error(self.request, _("No voucher found with code '%(code)s'" % {'code': code}))
|
|
176
|
|
- else:
|
|
|
177
|
+ else:
|
|
177
|
178
|
self.apply_voucher_to_basket(voucher)
|
|
178
|
179
|
return HttpResponseRedirect(self.request.META.get('HTTP_REFERER', reverse('basket:summary')))
|
|
179
|
180
|
|
|
180
|
181
|
def form_invalid(self, form):
|
|
181
|
182
|
return HttpResponseRedirect(reverse('basket:summary'))
|
|
182
|
|
-
|
|
|
183
|
+
|
|
183
|
184
|
|
|
184
|
185
|
class VoucherRemoveView(View):
|
|
185
|
186
|
voucher_model = get_model('voucher', 'voucher')
|
|
186
|
|
-
|
|
|
187
|
+
|
|
187
|
188
|
def get(self, request, *args, **kwargs):
|
|
188
|
189
|
return HttpResponseRedirect(reverse('basket:summary'))
|
|
189
|
|
-
|
|
|
190
|
+
|
|
190
|
191
|
def post(self, request, *args, **kwargs):
|
|
191
|
192
|
voucher_id = int(kwargs.pop('pk'))
|
|
192
|
193
|
if not request.basket.id:
|
|
|
@@ -220,7 +221,7 @@ class SavedView(ModelFormSetView):
|
|
220
|
221
|
return saved_basket.lines.all().select_related('product', 'product__stockrecord')
|
|
221
|
222
|
except self.basket_model.DoesNotExist:
|
|
222
|
223
|
return []
|
|
223
|
|
-
|
|
|
224
|
+
|
|
224
|
225
|
def get_success_url(self):
|
|
225
|
226
|
return self.request.META.get('HTTP_REFERER', reverse('basket:summary'))
|
|
226
|
227
|
|
|
|
@@ -228,7 +229,7 @@ class SavedView(ModelFormSetView):
|
|
228
|
229
|
for form in formset:
|
|
229
|
230
|
if form.cleaned_data['move_to_basket']:
|
|
230
|
231
|
msg = "'%s' has been moved back to your basket" % form.instance.product
|
|
231
|
|
- messages.info(self.request, msg)
|
|
|
232
|
+ messages.info(self.request, msg)
|
|
232
|
233
|
real_basket = self.request.basket
|
|
233
|
234
|
real_basket.merge_line(form.instance)
|
|
234
|
235
|
return super(SavedView, self).formset_valid(formset)
|