Wizard Form

Tampilan sebuah halaman pada OpenERP umumnya merupakan tampilan sebuah tabel atau sebuah record. Pencetakan laporan bergantung pada record yang sedang tampil ini, atau record yang dicentang. Situasi seperti ini menjadi tidak nyaman manakala kita ingin mencetak lebih dari 80 record dimana ini adalah nilai default record yang tampak. Untuk 80 record berikutnya perlu klik Next page, centang semua, klik lagi menu Cetak. Merepotkan.

Ya, kita membutuhkan sebuah form yang menawarkan filter khusus sesuai jenis laporan. Misalkan untuk kebutuhan "cetak komentar yang mengandung kata open". Pada filter Cari user memasukkan open lalu klik tombol Cetak yang ada di bawahnya, maka tampillah PDF berisi baris-baris komentar yang mengandung kata open, incase-senstive. Begitulah skenarionya. Dalam perbincangan OpenERP form ini disebut sebagai wizard.

Sebuah form adalah sebuah tabel, begitulah kebiasaannya. Hal yang sama juga dilakukan untuk membuat wizard, hanya saja tabelnya tidak disimpan di database, melainkan cukup di memori.

Jika Anda belum memiliki modul hello, ikutilah dua tulisan sebelumnya, berturut-turut:

  1. Hello world!
  2. OpenOffice Report Designer

Kalau sudah, buatlah direktori addons/hello/wizard, dan mulailah membuat addons/hello/wizard/comment.py.

from osv import osv, fields

class wizard_comment(osv.osv_memory):
_name = 'hello.wizard_comment'
_columns = {
'comment': fields.char('Comment', size=160),
}

def default_get(self, cr, user, fields_list=None, context=None):
return {'comment': 'open'}

def print_report(self, cr, uid, ids, context={}):
res = self.read(cr, uid, ids, ['comment'], context=context)
res = res[0]
obj = self.pool.get('hello.comment')
ids = obj.search(cr, uid, [('comment', 'ilike', res['comment'])])
datas = {'ids': ids,
'form': res}
return {'datas': datas,
'report_name': 'komentar',
'type': 'ir.actions.report.xml'}

wizard_comment()

Perhatikan baris 18 pada 'report_name': 'komentar', dimana komentar sesuai file addons/hello/report/comment.py pada baris 'report.komentar':

report_sxw.report_sxw('report.komentar', 'hello.comment',
'addons/hello/report/hello.rml', parser=comment)

tapi tanpa awalan report. Paham kan ?

Pastikan file ini dimuat sistem, yaitu dengan mendaftarkannya di addons/hello/wizard/__init__.py:

import comment

Tentunya direktori addons/hello/wizard tidak akan terpanggil bila kita belum mendaftarkannya di addons/hello/__init__.py:

import hello
import report
import wizard

Selanjutnya urusan tampilan, yaitu dengan membuat addons/hello/wizard/menu.xml:





hello.wizard_comment.form
hello.wizard_comment
form





string="Print"/>


name="Search word"
res_model="hello.wizard_comment"
view_mode="form"
target="new"
key2="client_print_multi"/>

parent="menu_hello"
name="Print comments"
action="window_wizard_comment"/>


Daftarkan di addons/hello/__openerp__.py di bagian init_xml:

...
'init_xml' : [
'wizard/menu.xml',
....

Atau lengkapnya menjadi:

{
'name' : 'Hello world!',
'version' : '1.0',
'author' : 'OpenSIPKD',
'depends' : ['base'],
'init_xml' : [
'hello_view.xml',
'report/menu.xml',
'wizard/menu.xml'],
'application': True,
'description': 'A simple form to insert, edit, or delete your comments.'
}

Pembuatan file selesai. Kini lakukan langkah pembaharuan / upgrade modul hello:

  1. Klik menu Settings, Modules.
  2. Masukkan hello pada Name untuk mencari modul ini.
  3. Setelah ditemukan klik Hello world! untuk melihat rinciannya.
  4. Klik Upgrade.
  5. Setelah prosesnya selesai, klik Update.
  6. Akhiri dengan klik Start configuration, atau cukup klik Close, karena memang tidak ada yang perlu dikonfigurasi.

Saatnya untuk mencoba. Klik menu Hello, Print comments. Masukkan kata yang akan dicari, katakanlah open, lalu klik Print untuk menampilkan PDF-nya.

Tampak PDF telah menampilkan record yang dimaksud, yaitu hanya menampilkan komentar yang mengandung kata open. Sudah cukup ? Belum.

Laporan ini tidak ubahnya dengan laporan sebelumnya yang tidak menggunakan wizard form. Mengapa ? Karena ia memang menggunakan file RML yang sama, yaitu hello.rml. Jadi bagaimana seharusnya ?

Selayaknya PDF yang dihasilkan wizard form memberikan keterangan seperti Daftar Komentar yang Mengandung Kata "open" dimana kata open diambil dari filter yang diisi user. Bagaimana menyertakannya ?

Kita membutuhkan sebuah file RML lagi, mirip hello.rml, hanya ditambahkan beberapa kata seperti di atas. Salinlah addons/hello/report/hello.rml menjadi addons/hello/report/cari_kata.rml.


$ sudo cp addons/hello/report/hello.rml addons/hello/report/cari_kata.rml

Di cari_kata.rml carilah baris ini:

Daftar Komentar

dan ubah menjadi:

Daftar Komentar yang Mengandung Kata "[[ data['form']['comment'] ]]"

Selanjutnya daftarkan file tersebut di addons/hello/report/comment.py dengan menambah baris berikut ini:

report_sxw.report_sxw('report.cari_kata', 'hello.comment',
'addons/hello/report/cari_kata.rml', parser=comment, header=False)

Sehingga secara keseluruhan menjadi:

import time
from report import report_sxw

class comment(report_sxw.rml_parse):
def __init__(self, cr, uid, name, context):
super(comment, self).__init__(cr, uid, name, context)
self.localcontext.update({
'time': time,
})

report_sxw.report_sxw('report.komentar', 'hello.comment',
'addons/hello/report/hello.rml', parser=comment)

report_sxw.report_sxw('report.cari_kata', 'hello.comment',
'addons/hello/report/cari_kata.rml', parser=comment, header=False)

Kemudian pada addons/hello/wizard/comment.py ganti baris:

'report_name': 'komentar',

menjadi:

'report_name': 'cari_kata',

sehingga secara keseluruhan menjadi:

from osv import osv, fields

class wizard_comment(osv.osv_memory):
_name = 'hello.wizard_comment'
_columns = {
'comment': fields.char('Comment', size=160),
}

def print_report(self, cr, uid, ids, context={}):
res = self.read(cr, uid, ids, ['comment'], context=context)
res = res[0]
obj = self.pool.get('hello.comment')
ids = obj.search(cr, uid, [('comment', 'ilike', res['comment'])])
datas = {'ids': ids,
'form': res}
return {'datas': datas,
'report_name': 'cari_kata',
'type': 'ir.actions.report.xml'}

wizard_comment()

Karena ada perubahan pada source Python, maka diperlukan restart daemon openerp:

$ sudo /etc/init.d/openerp restart

Kemudian cobalah mencetak lagi, seharusnya PDF menjadi seperti ini:

Mudah bukan ?

Referensi:

File: