def update(request): """Update cart quantities.""" if request.method != 'POST': return HttpResponseNotAllowed('GET not allowed; POST is required.') else: cart = Cart(request) for item in cart: index = 'quantity-%s' % unicode(item.formindex) if index in request.POST: try: quantity = int(request.POST[index]) cart.update(item.product, quantity, item['options']) except ValueError: pass notification = (messages.SUCCESS, 'Cart updated. <a href="%s">View cart</a>' % (reverse(checkout))) if request.is_ajax(): response = HttpResponse() data = { 'cart': cart.as_dict(), 'notification': notification, } response.write(simplejson.dumps(data)) return response else: messages.add_message(request, *notification) return HttpResponseRedirect(request.POST.get('redirect_to', reverse(checkout)))
def checkout(request): """Display a list of cart items, quantities, total etc, with the option to change quantities, specify shipping options etc.""" if cart_settings.SKIP_CHECKOUT: return HttpResponseRedirect(reverse('cart.views.delivery')) else: cart = Cart(request) shipping_options_form_cls = shipping_options_form_factory(cart) checkout_form_cls = checkout_form_factory() if request.method == 'POST': checkout_form = checkout_form_cls(request.POST) shipping_options_form = shipping_options_form_cls(request.POST, prefix='shipping') valid = checkout_form.is_valid() and shipping_options_form.is_valid() if valid: checkout_form.update(cart) shipping_options_form.update(cart) for item in cart: index = 'quantity-%s' % unicode(item.formindex) try: if str(request.POST.get(index, None)).lower() == 'remove': quantity = 0 else: quantity = int(request.POST.get(index, item['quantity']) or 0) cart.update(item.product, quantity, item['options']) except ValueError: pass if request.POST.get('next', False): redirect_url = reverse(delivery) else: redirect_url = request.path_info if request.is_ajax(): html = render_to_string( 'cart/checkout_ajax.html', RequestContext(request, { 'cart': cart, 'steps': steps(request), 'current_step': 1, 'checkout_form': checkout_form, 'shipping_options_form': shipping_options_form, }) ) return HttpResponse(simplejson.dumps({ 'success': valid, 'redirect_url': redirect_url if valid else None, 'html': html, }), mimetype='application/json') elif valid: return HttpResponseRedirect(redirect_url) else: checkout_form = checkout_form_cls(initial=cart.detail_data) shipping_options_form = shipping_options_form_cls(prefix='shipping', initial=cart.shipping_options) return render_to_response( 'cart/checkout.html', RequestContext(request, { 'cart': cart, 'steps': steps(request), 'current_step': 1, 'checkout_form': checkout_form, 'shipping_options_form': shipping_options_form, }) )