Programação de relatórios no servidor¶
Quando o servidor recebe uma solicitação de um cliente para gerar um relatório, ele, primeiramente, cria uma cópia do relatório e então essa cópia chama o método generate.
Este método dispara o evento on_before_generate. Neste manipulador de evento, o desenvolvedor deve escrever o código que gera o conteúdo do relatório.
Por exemplo, para o relatório invoice da aplicação Demo, este evento é o seguinte:
def on_generate(report):
invoices = report.task.invoices.copy()
invoices.set_where(id=report.id.value)
invoices.open()
customer = invoices.firstname.display_text + ' ' + invoices.customer.display_text
address = invoices.billing_address.display_text
city = invoices.billing_city.display_text + ' ' + invoices.billing_state.display_text + ' ' + \
invoices.billing_country.display_text
date = invoices.invoicedate.display_text
shipped = invoices.billing_address.display_text + ' ' + invoices.billing_city.display_text + ' ' + \
invoices.billing_state.display_text + ' ' + invoices.billing_country.display_text
taxrate = invoices.taxrate.display_text
report.print_band('title', locals())
tracks = invoices.invoice_table
tracks.open()
for t in tracks:
quantity = t.quantity.display_text
track = t.track.display_text
unitprice = t.unitprice.display_text
sum = t.amount.display_text
report.print_band('detail', locals())
subtotal = invoices.subtotal.display_text
tax = invoices.tax.display_text
total = invoices.total.display_text
report.print_band('summary', locals())
Primeiro, usamos o método copy para criar uma cópia do registro de faturas.
invoices = report.task.invoices.copy()
Criamos a cópia porque múltiplos usuários podem gerar simultaneamente o mesmo relatório em threads paralelas.
Em seguida, chamamos o método set_where da cópia:
invoices.set_where(id=report.id.value)
onde report.id.value é o parâmetro de ID do relatório, cujo valor definimos no manipulador de evento on_before_print_report no cliente e que é igual ao valor atual do campo id do registro de invoice.
Depois, usando o método open, obtemos os registros no servidor. Após isso, o método print_band é usado para imprimir o título:
report.print_band('title', locals())
Mas antes disso, atribuímos valores a quatro variáveis locais: customer, address, city e date, que correspondem às células programáveis na faixa de título no template do relatório.
Em seguida, da mesma forma, geramos as faixas de detalhes e resumo.
Quando o relatório é gerado e o valor do atributo extension, definido no cliente, não é igual a ‘pdf’, o servidor converte o arquivo ods usando o LibreOffice.
Uma vez que o relatório é gerado, ele é armazenado na pasta de relatórios do diretório estático e o servidor envia ao cliente a URL do arquivo do relatório.