def update(request, cart, variant_id): if not request.is_ajax(): return redirect('cart:index') variant = get_object_or_404(ProductVariant, pk=variant_id) discounts = request.discounts status = None form = ReplaceCartLineForm(request.POST, cart=cart, variant=variant, discounts=discounts) if form.is_valid(): form.save() response = {'productId': variant_id, 'subtotal': 0, 'total': 0} updated_line = cart.get_line(form.cart_line.variant) if updated_line: response['subtotal'] = currencyfmt( updated_line.get_total(discounts=discounts).gross, updated_line.get_total(discounts=discounts).currency) if cart: cart_total = cart.get_total(discounts=discounts) response['total'] = currencyfmt(cart_total.gross, cart_total.currency) local_cart_total = to_local_currency(cart_total, request.currency) if local_cart_total: response['localTotal'] = currencyfmt(local_cart_total.gross, local_cart_total.currency) status = 200 elif request.POST is not None: response = {'error': form.errors} status = 400 return JsonResponse(response, status=status)
def prepare_line_data(line): product_class = line.variant.product.product_class attributes = product_class.variant_attributes.all() first_image = line.variant.get_first_image() price_per_item = line.get_price_per_item(discounts=request.discounts) line_total = line.get_total(discounts=request.discounts) return { 'variant': line.variant.name, 'quantity': line.quantity, 'attributes': line.variant.display_variant(attributes), 'image': first_image.url if first_image else None, 'price_per_item': currencyfmt(price_per_item.gross, price_per_item.currency), 'line_total': currencyfmt(line_total.gross, line_total.currency), 'update_url': reverse('cart:update-line', kwargs={'variant_id': line.variant_id}), 'variant_url': line.variant.get_absolute_url() }
def index(request, product_id=None): if product_id is not None: product_id = int(product_id) cart = Cart.for_session_cart(request.cart, discounts=request.discounts) if contains_unavailable_products(cart): msg = _("Sorry. We don't have that many items in stock. " "Quantity was set to maximum available for now.") messages.warning(request, msg) remove_unavailable_products(cart) for line in cart: data = None if line.product.pk == product_id: data = request.POST initial = {"quantity": line.get_quantity()} form = ReplaceCartLineForm(data, cart=cart, product=line.product, initial=initial) line.form = form if form.is_valid(): form.save() if request.is_ajax(): response = { "product_id": line.product.pk, "subtotal": currencyfmt(line.get_total().gross, line.get_total().currency), "total": 0, } if cart: response["total"] = currencyfmt(cart.get_total().gross, cart.get_total().currency) return JsonResponse(response) return redirect("cart:index") elif data is not None: if request.is_ajax(): response = {"error": form.errors} return JsonResponse(response, status=400) cart_partitioner = cart.partition() return TemplateResponse(request, "cart/index.html", {"cart": cart_partitioner})
def update(request, cart, variant_id): if not request.is_ajax(): return redirect('cart:index') variant = get_object_or_404(ProductVariant, pk=variant_id) discounts = request.discounts status = None form = ReplaceCartLineForm(request.POST, cart=cart, variant=variant, discounts=discounts) if form.is_valid(): form.save() response = {'productId': variant_id, 'subtotal': 0, 'total': 0} updated_line = cart.get_line(form.cart_line.variant) if updated_line: response['subtotal'] = currencyfmt( updated_line.get_total(discounts=discounts).gross, updated_line.get_total(discounts=discounts).currency) if cart: cart_total = cart.get_total(discounts=discounts) response['total'] = currencyfmt( cart_total.gross, cart_total.currency) local_cart_total = to_local_currency(cart_total, request.currency) if local_cart_total: response['localTotal'] = currencyfmt( local_cart_total.gross, local_cart_total.currency) status = 200 elif request.POST is not None: response = {'error': form.errors} status = 400 return JsonResponse(response, status=status)
def summary(request, cart): def prepare_line_data(line): product_class = line.variant.product.product_class attributes = product_class.variant_attributes.all() first_image = line.variant.get_first_image() price_per_item = line.get_price_per_item(discounts=request.discounts) line_total = line.get_total(discounts=request.discounts) return { 'product': line.variant.product, 'variant': line.variant.name, 'quantity': line.quantity, 'attributes': line.variant.display_variant(attributes), 'image': first_image, 'price_per_item': currencyfmt( price_per_item.gross, price_per_item.currency), 'line_total': currencyfmt(line_total.gross, line_total.currency), 'update_url': reverse('cart:update-line', kwargs={'variant_id': line.variant_id}), 'variant_url': line.variant.get_absolute_url()} if cart.quantity == 0: data = {'quantity': 0} else: cart_total = cart.get_total(discounts=request.discounts) data = { 'quantity': cart.quantity, 'total': currencyfmt(cart_total.gross, cart_total.currency), 'lines': [prepare_line_data(line) for line in cart.lines.all()]} return render(request, 'cart-dropdown.html', data)
def prepare_line_data(line): product_class = line.variant.product.product_class attributes = product_class.variant_attributes.all() first_image = line.variant.get_first_image() price_per_item = line.get_price_per_item(discounts=request.discounts) line_total = line.get_total(discounts=request.discounts) return { 'product': line.variant.product, 'variant': line.variant.name, 'quantity': line.quantity, 'attributes': line.variant.display_variant(attributes), 'image': first_image, 'price_per_item': currencyfmt( price_per_item.gross, price_per_item.currency), 'line_total': currencyfmt(line_total.gross, line_total.currency), 'update_url': reverse('cart:update-line', kwargs={'variant_id': line.variant_id}), 'variant_url': line.variant.get_absolute_url()}
def index(request, product_id=None): if product_id is not None: product_id = int(product_id) cart = Cart.for_session_cart(request.cart, discounts=request.discounts) if contains_unavailable_products(cart): msg = _('Sorry. We don\'t have that many items in stock. ' 'Quantity was set to maximum available for now.') messages.warning(request, msg) remove_unavailable_products(cart) for line in cart: data = None if line.product.pk == product_id: data = request.POST initial = {'quantity': line.get_quantity()} form = ReplaceCartLineForm(data, cart=cart, product=line.product, initial=initial) line.form = form if form.is_valid(): form.save() if request.is_ajax(): response = { 'productId': line.product.pk, 'subtotal': currencyfmt(line.get_total().gross, line.get_total().currency), 'total': 0 } if cart: response['total'] = currencyfmt(cart.get_total().gross, cart.get_total().currency) return JsonResponse(response) return redirect('cart:index') elif data is not None: if request.is_ajax(): response = {'error': form.errors} return JsonResponse(response, status=400) cart_partitioner = cart.partition() return TemplateResponse(request, 'cart/index.html', {'cart': cart_partitioner})
def test_cart_summary_page(client, product_in_stock, request_cart): variant = product_in_stock.variants.get() request_cart.add(variant, 1) response = client.get('/cart/summary/') assert response.status_code == 200 content = response.context assert content['quantity'] == request_cart.quantity cart_total = request_cart.get_total() assert content['total'] == currencyfmt( cart_total.gross, cart_total.currency) assert len(content['lines']) == 1 cart_line = content['lines'][0] assert cart_line['variant'] == variant.name assert cart_line['quantity'] == 1
def test_cart_summary_page(client, product_in_stock, request_cart): variant = product_in_stock.variants.get() request_cart.add(variant, 1) response = client.get('/cart/summary/') assert response.status_code == 200 content = response.context assert content['quantity'] == request_cart.quantity cart_total = request_cart.get_total() assert content['total'] == currencyfmt(cart_total.gross, cart_total.currency) assert len(content['lines']) == 1 cart_line = content['lines'][0] assert cart_line['variant'] == variant.name assert cart_line['quantity'] == 1
def index(request, product_id=None): if product_id is not None: product_id = int(product_id) cart = Cart.for_session_cart(request.cart, discounts=request.discounts) # if contains_unavailable_products(cart): # msg = _('Sorry. We don\'t have that many items in stock. ' # 'Quantity was set to maximum available for now.') # messages.warning(request, msg) # remove_unavailable_products(cart) for line in cart: data = None if line.product.pk == product_id: data = request.POST initial = {'quantity': line.get_quantity()} form = ReplaceCartLineForm(data, cart=cart, product=line.product, initial=initial) line.form = form if form.is_valid(): form.save() if request.is_ajax(): response = {'product_id': line.product.pk, 'subtotal': currencyfmt(line.get_total().gross, line.get_total().currency), 'total': 0} if cart: response['total'] = currencyfmt( cart.get_total().gross, cart.get_total().currency) return JsonResponse(response) return redirect('cart:index') elif data is not None: if request.is_ajax(): response = {'error': form.errors} return JsonResponse(response, status=400) cart_partitioner = cart.partition() return TemplateResponse( request, 'cart/index.html', { 'cart': cart_partitioner})
def update(request, cart, variant_id): if not request.is_ajax(): return redirect("cart:index") variant = get_object_or_404(ProductVariant, pk=variant_id) discounts = request.discounts status = None form = ReplaceCartLineForm(request.POST, cart=cart, variant=variant, discounts=discounts) if form.is_valid(): form.save() response = {"productId": variant_id, "subtotal": 0, "total": 0} updated_line = cart.get_line(form.cart_line.variant) if updated_line: response["subtotal"] = currencyfmt( updated_line.get_total(discounts=discounts).gross, updated_line.get_total(discounts=discounts).currency ) if cart: response["total"] = currencyfmt( cart.get_total(discounts=discounts).gross, cart.get_total(discounts=discounts).currency ) status = 200 elif request.POST is not None: response = {"error": form.errors} status = 400 return JsonResponse(response, status=status)
def summary(request, cart): def prepare_line_data(line): product_class = line.variant.product.product_class attributes = product_class.variant_attributes.all() first_image = line.variant.get_first_image() price_per_item = line.get_price_per_item(discounts=request.discounts) line_total = line.get_total(discounts=request.discounts) return { 'product': line.variant.product, 'variant': line.variant.name, 'quantity': line.quantity, 'attributes': line.variant.display_variant(attributes), 'image': first_image, 'price_per_item': currencyfmt(price_per_item.gross, price_per_item.currency), 'line_total': currencyfmt(line_total.gross, line_total.currency), 'update_url': reverse('cart:update-line', kwargs={'variant_id': line.variant_id}), 'variant_url': line.variant.get_absolute_url() } if cart.quantity == 0: data = {'quantity': 0} else: cart_total = cart.get_total(discounts=request.discounts) data = { 'quantity': cart.quantity, 'total': currencyfmt(cart_total.gross, cart_total.currency), 'lines': [prepare_line_data(line) for line in cart.lines.all()] } return render(request, 'cart-dropdown.html', data)
def tax(price, html=False): if html: return format_price(price.tax, price.currency) return currencyfmt(price.tax, price.currency)
def gross(price, html=False, normalize=False): if html or normalize: return format_price(price.gross, price.currency, html, normalize) return currencyfmt(price.gross, price.currency)
def tax(price, html=False, normalize=False): if html or normalize: return format_price(price.tax, price.currency, html, normalize) return currencyfmt(price.tax, price.currency)
def tax(price, html=False): if html: return format_price(price.tax, price.currency) return currencyfmt(price.tax, price.currency)
def net(price, html=False): if html: return format_price(price.net, price.currency) return currencyfmt(price.net, price.currency)
def net(price, html=False): if html: return format_price(price.net, price.currency) return currencyfmt(price.net, price.currency)
def gross(price, html=False): if html: return format_price(price.gross, price.currency) return currencyfmt(price.gross, price.currency)
def net(price): return currencyfmt(price.net, price.currency)
def gross(price): return currencyfmt(price.gross, price.currency)
def tax(price): return currencyfmt(price.tax, price.currency)