How do I calculate the subtotal and the total per column?
views.py
def soma_tuplas(a, b):
return (a[0] + b[0], a[1] + b[1], a[2] + b[2], a[3], a[4])
def quotation_list(request):
stores = Store.objects.all()
products = Product.objects.all()
# indice
index_store = {store.id: index for index, store in enumerate(stores)}
index_product = {product.id: index for index,
product in enumerate(products)}
# dados para o template
cabecalho = ["Lojas"] + [store.store for store in stores]
linhas = [([product.product] + [None for store in stores] + [(0, 0, 0, None, product.product)])
for product in products] + [["Subtotal"] + [(0, 0, 0, store.store, None) for store in stores]
+ [(0, 0, 0, None, None)]]
for pev in Quotation.objects.all():
total = pev.price * pev.quantity
i0 = index_product[pev.product_id]
i1 = index_store[pev.store_id] + 1
valor = (pev.price, pev.quantity, total, pev.store, pev.product)
linhas[i0][i1] = valor
# Subtotal da linha
linhas[i0][len(stores) + 1] = soma_tuplas(
linhas[i0][len(stores) + 1], valor)
# Subtotal da coluna
linhas[len(products)][i1] = soma_tuplas(
linhas[len(products)][i1], valor)
# Total da tabela
linhas[len(products)][len(stores) + 1] = soma_tuplas(
linhas[len(products)][len(stores) + 1], valor)
# retorna o menor preço de cada produto
# a quantidade, total e loja também estão nesta lista
mais_barato = []
for linha in linhas:
mais_barato.append(min(linha[1:]))
# print(linhas[i0][len(stores) + 1])
# destaca os menores preços no template
mb = 0
if request.GET.get('mais_barato', False):
mb = 1
# mostra somente os menores preços
smb = 0
if request.GET.get('somente_mais_barato', False):
smb = 1
linhas_mais_barato = zip(linhas, mais_barato)
# mostra os produtos mais baratos, a quantidade e o total
bqt = 0
if request.GET.get('quantidade_e_total', False):
linhas_mais_barato = sorted(linhas_mais_barato,
key=lambda store: str(store[1][3])) # sort by store
bqt = 1
context = {
'cabecalho': cabecalho,
'linhas_mais_barato': linhas_mais_barato,
'mb': mb,
'smb': smb,
'bqt': bqt,
}
return render(request, 'core/quotation_list.html', context)
template
{% for linha, mais_barato in linhas_mais_barato %}
<tr>
{% for item in linha %}
{% if bqt == 0 %}
{% if forloop.first %}
<td>{{ item }}</td>
{% elif forloop.last %}
<td> </td>
{% else %}
{% if mb == 1 %}
{% if mais_barato == item %}
<td class="text-center" style="border: 1px solid #f07746; background-color: #fbddd1;">{{ item.0 }}</td>
{% else %}
<td class="text-center">{{ item.0 }}</td>
{% endif %}
{% elif smb == 1 %}
{% if mais_barato == item %}
<td class="text-center">{{ item.0 }}</td>
{% else %}
<td> </td>
{% endif %}
{% elif bqt == 0 %}
<td class="text-center">{{ item.0 }}</td>
{% endif %}
{% endif %}
{% endif %}
{% endfor %}
{% if bqt == 1 %}
<td>{{ mais_barato.4 }}</td>
<td class="text-center">{{ mais_barato.0 }}</td>
<td class="text-center">{{ mais_barato.1 }}</td>
<td class="text-center">{{ mais_barato.2 }}</td>
<td class="text-center">{{ mais_barato.3 }}</td>
{% endif %}
I've been missing something: on the page I'm returning the following values
Generatedbythefollowingtemplatecode:
{%ifbqt==1%}<td>{{mais_barato.4}}</td><tdclass="text-center">{{ mais_barato.0 }}</td>
<td class="text-center">{{ mais_barato.1 }}</td>
<td class="text-center">{{ mais_barato.2 }}</td>
<td class="text-center">{{ mais_barato.3 }}</td>
{% endif %}
And that in turn was generated from
views.py
# retorna o menor preço de cada produto
# a quantidade, total e loja também estão nesta lista
mais_barato = []
for linha in linhas:
mais_barato.append(min(linha[1:]))
The problem is that as I'm using the values from the mais_barato
list (maybe wrongly), I need to: