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.