def cart(request, template="shop/cart.html"): """ Display cart and handle removing items from the cart. """ cart_formset = CartItemFormSet(instance=request.cart) discount_form = DiscountForm(request, request.POST or None) if request.method == "POST": valid = True if request.POST.get("update_cart"): valid = request.cart.has_items() if not valid: # Session timed out. info(request, _("Your cart has expired")) else: cart_formset = CartItemFormSet(request.POST, instance=request.cart) valid = cart_formset.is_valid() if valid: cart_formset.save() recalculate_discount(request) info(request, _("Cart updated")) else: valid = discount_form.is_valid() if valid: discount_form.set_discount() if valid: return redirect("shop_cart") context = {"cart_formset": cart_formset} settings.use_editable() if (settings.SHOP_DISCOUNT_FIELD_IN_CART and DiscountCode.objects.active().count() > 0): context["discount_form"] = discount_form return render(request, template, context)
def recalculate_cart(request): """ Updates an existing discount code, shipping, and tax when the cart is modified. """ from cartridge.shop import checkout from cartridge.shop.forms import DiscountForm from cartridge.shop.models import Cart # Rebind the cart to request since it's been modified. if request.session.get('cart') != request.cart.pk: request.session['cart'] = request.cart.pk request.cart = Cart.objects.from_request(request) discount_code = request.session.get("discount_code", "") if discount_code: # Clear out any previously defined discount code # session vars. names = ("free_shipping", "discount_code", "discount_total") clear_session(request, *names) discount_form = DiscountForm(request, {"discount_code": discount_code}) if discount_form.is_valid(): discount_form.set_discount() handler = lambda s: import_dotted_path(s) if s else lambda *args: None billship_handler = handler(settings.SHOP_HANDLER_BILLING_SHIPPING) tax_handler = handler(settings.SHOP_HANDLER_TAX) try: if request.session["order"]["step"] >= checkout.CHECKOUT_STEP_FIRST: billship_handler(request, None) tax_handler(request, None) except (checkout.CheckoutError, ValueError, KeyError): pass
def cart(request, template="shop/cart.html"): """ Display cart and handle removing items from the cart. """ cart_formset = CartItemFormSet(instance=request.cart) discount_form = DiscountForm(request, request.POST or None) if request.method == "POST": valid = True if request.POST.get("update_cart"): valid = request.cart.has_items() if not valid: # Session timed out. info(request, _("Your cart has expired")) else: cart_formset = CartItemFormSet(request.POST, instance=request.cart) valid = cart_formset.is_valid() if valid: cart_formset.save() recalculate_cart(request) info(request, _("Cart updated")) else: # Reset the cart formset so that the cart # always indicates the correct quantities. # The user is shown their invalid quantity # via the error message, which we need to # copy over to the new formset here. errors = cart_formset._errors cart_formset = CartItemFormSet(instance=request.cart) cart_formset._errors = errors else: valid = discount_form.is_valid() if valid: discount_form.set_discount() # Potentially need to set shipping if a discount code # was previously entered with free shipping, and then # another was entered (replacing the old) without # free shipping, *and* the user has already progressed # to the final checkout step, which they'd go straight # to when returning to checkout, bypassing billing and # shipping details step where shipping is normally set. recalculate_cart(request) if valid: return redirect("shop_cart") context = {"cart_formset": cart_formset} settings.use_editable() if (settings.SHOP_DISCOUNT_FIELD_IN_CART and DiscountCode.objects.active().exists()): context["discount_form"] = discount_form return render(request, template, context)
def recalculate_discount(request): """ Updates an existing discount code when the cart is modified. """ from cartridge.shop.forms import DiscountForm from cartridge.shop.models import Cart # Rebind the cart to request since it's been modified. request.cart = Cart.objects.from_request(request) discount_code = request.session.get("discount_code", "") discount_form = DiscountForm(request, {"discount_code": discount_code}) if discount_form.is_valid(): discount_form.set_discount() else: try: del request.session["discount_total"] except KeyError: pass
def cart(request, template="shop/cart.html"): """ Display cart and handle removing items from the cart. """ cart_formset = CartItemFormSet(instance=request.cart) discount_form = DiscountForm(request, request.POST or None) if request.method == "POST": valid = True if request.POST.get("update_cart"): valid = request.cart.has_items() if not valid: # Session timed out. info(request, _("Your cart has expired")) else: cart_formset = CartItemFormSet(request.POST, instance=request.cart) valid = cart_formset.is_valid() if valid: cart_formset.save() recalculate_cart(request) info(request, _("Cart updated")) else: # Reset the cart formset so that the cart # always indicates the correct quantities. # The user is shown their invalid quantity # via the error message, which we need to # copy over to the new formset here. errors = cart_formset._errors cart_formset = CartItemFormSet(instance=request.cart) cart_formset._errors = errors else: valid = discount_form.is_valid() if valid: discount_form.set_discount() if valid: return redirect("shop_cart") context = {"cart_formset": cart_formset} settings.use_editable() no_discounts = not DiscountCode.objects.active().exists() discount_applied = "discount_code" in request.session discount_in_cart = settings.SHOP_DISCOUNT_FIELD_IN_CART if not no_discounts and not discount_applied and discount_in_cart: context["discount_form"] = discount_form return render(request, template, context)
def cart(request, template="shop/cart.html"): """ Display cart and handle removing items from the cart. """ cart_formset = CartItemFormSet(instance=request.cart) discount_form = DiscountForm(request, request.POST or None) if request.method == "POST": valid = True if request.POST.get("update_cart"): valid = request.cart.has_items() if not valid: # Session timed out. info(request, _("Your cart has expired")) else: cart_formset = CartItemFormSet(request.POST, instance=request.cart) valid = cart_formset.is_valid() if valid: cart_formset.save() recalculate_discount(request) info(request, _("Cart updated")) else: # Reset the cart formset so that the cart # always indicates the correct quantities. # The user is shown their invalid quantity # via the error message, which we need to # copy over to the new formset here. errors = cart_formset._errors cart_formset = CartItemFormSet(instance=request.cart) cart_formset._errors = errors else: valid = discount_form.is_valid() if valid: discount_form.set_discount() if valid: return redirect("shop_cart") context = {"cart_formset": cart_formset} settings.use_editable() if (settings.SHOP_DISCOUNT_FIELD_IN_CART and DiscountCode.objects.active().count() > 0): context["discount_form"] = discount_form return render(request, template, context)
def cart(request, template="shop/cart.html"): """ Display cart and handle removing items from the cart. """ discount_form = DiscountForm(request, request.POST or None) if request.method == "POST": remove_sku = request.POST.get("item_id") if remove_sku: cart = Cart.objects.from_request(request) cart.remove_item(remove_sku) info(request, _("Item removed from cart"), fail_silently=True) elif discount_form.is_valid(): discount_form.set_discount() return HttpResponseRedirect(reverse("shop_cart")) context = {} settings.use_editable() if (settings.SHOP_DISCOUNT_FIELD_IN_CART and DiscountCode.objects.active().count() > 0): context["discount_form"] = discount_form return render_to_response(template, context, RequestContext(request))
def cart(request, template="shop/cart.html"): """ Display cart and handle removing items from the cart. """ if 'delivery min' in request.session: delivery_min = request.session['delivery min'] else: delivery_min = [] if 'store slug' in request.session: store_slug = request.session['store slug'] else: store_slug = '/shop/' address = request.session['address'] current_store = [] if 'cart loaded' in request.session: current_store = request.session['stores'][0] cart_formset = CartItemFormSet(instance=request.cart) discount_form = DiscountForm(request, request.POST or None) tax_handler(request, None) if request.method == 'POST': tipform = TipForm(request.POST) if tipform.is_valid(): tip_percent = tipform.cleaned_data['tip'] tip = 0.01*float(tip_percent)*float(request.cart.total_price()) billship_handler(request, tip) # tax_handler(request, None) request.session['tip fixed'] = True else: tipform = TipForm() if 'shop_checkout' in request.POST: return redirect('/shop/checkout') elif request.method == "POST": valid = True if request.POST.get("update_cart"): valid = request.cart.has_items() if not valid: # Session timed out. if 'stores' in request.session: del request.session['stores'] if 'cart loaded' in request.session: del request.session['cart loaded'] info(request, _("Your cart has expired")) return redirect('/shop/') else: cart_formset = CartItemFormSet(request.POST, instance=request.cart) valid = cart_formset.is_valid() if valid: cart_formset.save() recalculate_cart(request) info(request, _("Cart updated")) else: # Reset the cart formset so that the cart # always indicates the correct quantities. # The user is shown their invalid quantity # via the error message, which we need to # copy over to the new formset here. errors = cart_formset._errors cart_formset = CartItemFormSet(instance=request.cart) cart_formset._errors = errors else: valid = discount_form.is_valid() if valid: discount_form.set_discount() if valid: total_quantity, number_forms, number_items_removed = 0, 0, 0 for form in cart_formset: number_forms += 1 if form.is_valid(): was_item_removed = form.cleaned_data["DELETE"] if was_item_removed: number_items_removed += 1 total_quantity += form.cleaned_data["quantity"] if number_forms==number_items_removed: if 'stores' in request.session: del request.session['stores'] if 'cart loaded' in request.session: del request.session['cart loaded'] return redirect('/shop/') elif total_quantity==0: if 'stores' in request.session: del request.session['stores'] if 'cart loaded' in request.session: del request.session['cart loaded'] # return redirect("shop_cart") return redirect('/shop/') ten_percent = 0.1*float(request.cart.total_price()) suggested_tip = '%.2f' % float((ten_percent>2.0)*ten_percent+(ten_percent <=2.0)*2.0) if 'tip fixed' in request.session: tip_fixed = True else: tip_fixed = False context = {"cart_formset": cart_formset, "delivery_min": delivery_min, "tipform": tipform, "suggested_tip": suggested_tip, "tip_fixed": tip_fixed, "store_slug": store_slug, "address": address, "stores": current_store} settings.use_editable() if (settings.SHOP_DISCOUNT_FIELD_IN_CART and DiscountCode.objects.active().count() > 0): context["discount_form"] = discount_form return render(request, template, context)