• Tidak ada hasil yang ditemukan

7. Dasar-dasar Report

7.6 Wizard

Dalam contoh modul buku_nop_report_1, kita bekerja pada model res.partner dan akan menambahkan satu report.

Report akan diakses lewat menuitem tersendiri. Hasil dari report adalah daftar partner dengan nama mengandung karakter tertentu. Untuk kebutuhan ini, kita tidak perlu memilih satu atau lebih record, karena justru yang ingin kita lakukan adalah mencari.

Kriteria pencarian dapat diinput pada wizard.

Ini merupakan contoh sederhana, namun dapat dikembangkan lebih lanjut.

Berikut adalah definisi report selengkapnya (buku_nop_report_1_report.xml):

<?xml version="1.0"?> <openerp> <data> <report id="report_buku_nop_report_1" name="buku.nop.report.1"

model="res.partner" rml="buku_nop_report_1/report.rml" auto="False" header="False"/> </data> </openerp>

Laporan sendiri akan dihasilkan dari file report.rml:

<?xml version="1.0"?>

<document filename="report.pdf">

<template pageSize="(612, 792)" title="Report"> <pageTemplate id="page">

<frame id="page" x1="30.0" y1="30.0" width="552" height="732"/> <pageGraphics>

<setFont name="Courier" size="8"/>

<drawString x="30" y="20">Halaman <pageNumber/></drawString> </pageGraphics> </pageTemplate> </template> <stylesheet> <blockTableStyle id="Table"> <blockAlignment value="LEFT"/> <blockValign value="TOP"/>

<lineStyle kind="GRID" colorName="#000000" start="0,0" stop="-1,-1"/> </blockTableStyle>

<paraStyle name="Standard" fontName="Courier"/> </stylesheet>

<story>

<para style="Standard">Buku Report 1<br/><br/></para>

<para style="Standard">Nama mengandung teks: [[ data.get('form', {}).get('name') ]]<br/><br/></para>

<blockTable colWidths="100,200,252" repeatRows="1" style="Table"> <tr> <td> <para style="Standard">ID</para> </td> <td> <para style="Standard">Nama</para> </td> <td> <para style="Standard">Website</para> </td> </tr> <tr> <td>

<para style="Standard">[[ repeatIn(objects, 'o') ]]</para> <para style="Standard">[[ o.id ]]</para>

</td> <td>

<para style="Standard">[[ o.name ]]</para> </td>

<td>

<para style="Standard">[[ o.website ]]</para> </td>

</tr>

</blockTable> </story>

</document>

Kriteria pencarian yang diinput oleh user lewat wizard dapat kita akses dengan cara berikut. Variabel data merupakan sebuah dictionary, mengandung key 'form', yang juga merupakan sebuah dictionary, mengandung key 'name' berisi apa yang diinput oleh user.

<para style="Standard">Nama mengandung teks: [[ data.get('form', {}).get('name') ]]<br/><br/></para>

Berikut adalah parser kita, yang disimpan dalam file buku_nop_report_1_report.py: from openerp.report import report_sxw

class buku_nop_report_1(report_sxw.rml_parse): def __init__(self, cr, uid, name, context):

super(buku_nop_report_1, self).__init__(cr, uid, name, context=context)

report_sxw.report_sxw('report.buku.nop.report.1', 'res.partner', 'addons/buku_nop_report_1/report.rml', parser=buku_nop_report_1)

Karena kita bekerja dengan wizard, kita perlu membuatnya terlebih dahulu, dalam bentuk sebuah class, yang diturunkan dari orm.TransientModel. Berikut adalah isi file buku_nop_report_1_wizard.py: from openerp.osv import orm, fields

class buku_nop_report_1(orm.TransientModel): _name = 'buku.nop.report.1'

_description = 'buku nop report 1 wizard'

}

def _get_data(self, cr, uid, ids, context=None): ret = {}

res = self.read(cr, uid, ids, context=context) if res:

ret = res[0] return ret

def download_pdf(self, cr, uid, ids, context=None): data = self._get_data(cr, uid, ids, context=context)

domain = [('name', 'ilike', data.get('name'))]

search_result = self.pool.get('res.partner').search(cr, uid, domain) datas = { 'ids': search_result, 'model': 'res.partner', 'form': data, } ret = { 'type': 'ir.actions.report.xml', 'report_name': self._name,

'datas': datas, }

return ret

Catatan:

• Wizard kita akan berisikan satu field, yaitu name (bertipe char). Kita akan gunakan ini sebagai kriteria pencarian sebelum menghasilkan report.

• Fungsi _get_data digunakan untuk mendapatkan input dari user, menggunakan method read. Ingatlah bahwa kita berada dalam model buku.nop.report.1 ketika kita melakukan read. Dengan ids yang kita lewatkan, kita akan mendapatkan anggota pertama dari list yang dikembalikan. Apabila diperlukan, bacalah juga contoh fungsi read dalam Bab 4.

• Yang sangat menarik adalah fungsi download_pdf. Nama ini bukan nama baku, dan diasosiasikan dengan sebuah tombol di view.

• Di dalam fungsi download_pdf, setelah mendapatkan informasi apa yang diinput oleh user, kita lakukan pencarian:

data = self._get_data(cr, uid, ids, context=context)

domain = [('name', 'ilike', data.get('name'))]

• Hasil pencarian, kita tempatkan pada sebuah dictionary dengan key adalah ids:

datas = {

'ids': search_result,

• Kita bekerja dengan model res.partner:

'model': 'res.partner',

• Dan, apa yang diinput oleh user bisa diakses dengan key form, sebagaimana kita lihat dalam file RML:

'form': data, }

• Fungsi akan mengembalikan satu dictionary dengan key memiliki arti khusus. Sebagai contoh, key datas dapat diakses dari dalam report sebagai variabel data.

'datas': datas,

<para style="Standard">Nama mengandung teks: [[ data.get('form', {}).get('name') ]]<br/><br/></para>

• Kita memberitahu OpenERP bahwa kita ingin menghasilkan report. Perhatikanlah key type berikut.

'type': 'ir.actions.report.xml', 'report_name': self._name,

• Kita bisa menggunakan kursor koneksi database (variabel cr) untuk melakukan SQL Query, langsung pada database.

Bagaimana wizard ditampilkan, kita definisikan dalam view buku_nop_report_1_view.xml:

<?xml version="1.0"?> <openerp>

<data>

<record model="ir.ui.view" id="buku_nop_report_1_form"> <field name="name">buku.nop.report.1</field>

<field name="model">buku.nop.report.1</field> <field name="arch" type="xml"> <form string="Buku Report 1">

<group>

<field name="name"/> <button

type="object" string="PDF"

class="oe_highlight"/>

<button string="Cancel" special="cancel"/>

</group> </form>

</field> </record>

<record model="ir.actions.act_window" id="action_buku_nop_report_1"> <field name="name">Report 1</field>

<field name="res_model">buku.nop.report.1</field> <field name="view_id" ref="buku_nop_report_1_form"/> <field name="target">new</field>

</record>

<menuitem name="Buku" id="menu_buku"/>

<menuitem name="Report" id="menu_buku_report" parent="menu_buku"/> <menuitem name="Buku Report 1" id="menu_buku_report_nop_report_1" parent="menu_buku_report" action="action_buku_nop_report_1"/>

</data> </openerp>

Perhatikanlah bahwa kita mendefinisikan tombol PDF dengan cara berikut:

<button

name="download_pdf" type="object"

string="PDF"

class="oe_highlight"/>

dimana fungsi akan menjalankan fungsi download_pdf (name) ketika diklik (type object). Tombol cancel merupakan tombol khusus:

<button string="Cancel" special="cancel"/>

Berikut adalah isi file __openerp__.py:

{

'name': 'Report 1', 'version': '1.0', 'author': 'noprianto',

'description': 'Laporan dengan wizard', 'category': 'Buku',

'website': 'https://github.com/id-python/buku-openerp', 'depends': ['base'],

'buku_nop_report_1_view.xml', 'buku_nop_report_1_report.xml', ],

}

Berikut adalah isi file __init__.py:

from . import buku_nop_report_1_report

Dalam dokumen DASAR DASAR OPENERP SISI TEKNIKAL DAN CO (Halaman 128-135)

Dokumen terkait