def prepare_line_data(line): product_type = line.variant.product.product_type attributes = product_type.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(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 summary(request, cart): """Display a cart summary suitable for displaying on all pages.""" def prepare_line_data(line): product_type = line.variant.product.product_type attributes = product_type.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(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 summary(request, cart): """Display a cart summary suitable for displaying on all pages.""" 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 amount(obj, format='text'): if format == 'text': return format_price( obj.amount, obj.currency, html=False) if format == 'html': return format_price( obj.amount, obj.currency, html=True) return currencyfmt(obj.amount, obj.currency)
def prepare_line_data(line): product_type = line.variant.product.product_type attributes = product_type.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(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 update(request, cart, variant_id): """Update the line quantities.""" 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 = { 'variantId': variant_id, 'subtotal': 0, 'total': 0, 'cart': { 'numItems': cart.quantity, 'numLines': len(cart) } } 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 test_cart_summary_page(client, product, request_cart): variant = product.variants.get() request_cart.add(variant, 1) response = client.get(reverse('cart: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.amount, 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 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, request_cart): variant = product.variants.get() request_cart.add(variant, 1) response = client.get(reverse('cart: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.amount, 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 update(request, cart, variant_id): """Update the line quantities.""" 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 = { 'variantId': variant_id, 'subtotal': 0, 'total': 0, 'cart': { 'numItems': cart.quantity, 'numLines': len(cart)}} 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 amount(obj, format="text"): if format == "text": return format_price(obj.amount, obj.currency, html=False) if format == "html": return format_price(obj.amount, obj.currency, html=True) return currencyfmt(obj.amount, obj.currency)
def format_money(money): return currencyfmt(money.amount, money.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 amount(obj, format='text'): if format == 'text': return format_price(obj.value, obj.currency, html=False) if format == 'html': return format_price(obj.value, obj.currency, html=True) return currencyfmt(obj.value, obj.currency)
def format_money(money): return currencyfmt(money.amount, money.currency)