4
How do I calculate subtotal and total per column?
py views.
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 %}
There is one thing I need to explain: on the page I am returning the following values
Generated by the following template code:
{% 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 %}
And which in turn was generated from
py views.
# 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, as I’m using the list values mais_barato
(perhaps erroneously), I need to:
@mgibsonbr created a new question. But I think it’s almost ready, taking advantage of everything you’ve already explained, I think you’d just need to rework the lists.
– Regis Santos
I know for you it might be best to just adapt the current code to complete with what you want, but I gave an answer suggesting a different approach. Because the structure of your table in this case is completely different from the one that originated the question. If you’re choosing between one structure and another - based on this variable
bqt
- i suggest switching between one code and another in the view also for that same variable (the new code to add is small, and the performance of your page should be much smaller without unnecessary code).– mgibsonbr