• Tidak ada hasil yang ditemukan

Form: attrs dan atribut lain

Dalam dokumen DASAR DASAR OPENERP SISI TEKNIKAL DAN CO (Halaman 101-107)

6. Dasar-dasar View

6.7 Form: attrs dan atribut lain

Dalam contoh modul buku_partner_nop_9, kita bekerja pada model res.partner dan akan bekerja dengan beberapa field yang ditambahkan pada buku_partner_nop_7.

Kita akan membuat sebuah tab baru, namun tab tersebut hanya tampil apabila partner adalah perorangan, bukan perusahaan. Apabila Is a Company? di centang, maka tab ini tidak ditampilkan. Lebih lanjut lagi, di dalam tab tersebut, kita tambahkan dua field, di mana salah satunya, akan menjadi required (harus diisi) apabila:

• Partner bukanlah perusahaan, dan • Alamat (street) tidak diisikan.

Berikut adalah definisi view selengkapnya (buku_partner_nop_9_view.xml):

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

<data>

<record model="ir.ui.view" id="view_partner_form"> <field name="name">res.partner.form</field> <field name="model">res.partner</field>

<field name="priority" eval="100"/> <field name="arch" type="xml"> <notebook>

<page string="Bukan perusahaan" attrs="{'invisible': [('is_company', '=', True)]}">

<group>

<field name="buku_field_17" password="True" nolabel="1" colspan="2"/>

<field name="buku_field_18" attrs="{'required': ['&amp;', ('is_company', '=', False), ('street', '=', False)]}"/>

</group> </page> </notebook> </field> </record> </data> </openerp>

Apa yang kita lakukan adalah:

• Menambahkan satu page dengan atribut attrs. Format atribut ini adalah: • {'atribut 1': [('nama_field 1', 'operator', nilai),...], …}

• dimana atribut adalah: readonly (tidak dapat diubah), invisible (tidak ditampilkan), required (harus diisi).

• Nilai default adalah {}

• Atribut yang kita tambahkan pada page tersebut menentukan page tersebut akan invisible (tidak ditampilkan) apabila kondisi berikut terpenuhi: [('is_company', '=', True)]

<page string="Bukan perusahaan" attrs="{'invisible': [('is_company', '=', True)]}">

… … …

</page>

• Menambahkan satu field dengan atribut password=”True” (input password/masked), nolabel=”1” (tidak menampilkan label) dan colspan=”2” (menempati dua kolom).

<field name="buku_field_17" password="True" nolabel="1" colspan="2"/>

• Menambahkan satu field lagi, dengan atribut attrs, di mana field akan required apabila kondisi berikut terpenuhi (&amp; untuk operator &) : ['&amp;', ('is_company', '=', False), ('street', '=', False)]

Catatan: eval digunakan untuk evaluasi ekspresi Python, digunakan untuk nilai non string.

Sama seperti sebelumnya, dalam contoh ini, kita turunkan view dari

buku_partner_nop_7.view_partner_form dan modul juga membutuhkan buku_partner_nop_7. File __openerp__.py dalam modul:

{

'name': 'Partner 9', 'version': '1.0', 'author': 'noprianto',

'description': 'form view (partner), atribut field', 'category': 'Buku',

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

'data': ['buku_partner_nop_9_view.xml'], }

6.8 Form: on change

Dalam contoh modul buku_partner_nop_10, kita bekerja pada model res.partner, dan ketika isi suatu field berubah, fungsi tertentu akan dipanggil. Dalam contoh ini, apa yang dilakukan oleh fungsi akan mengembalikan nilai dengan aturan tertentu, yang diartikan sebagai menampilkan pesan.

Berikut adalah definisi view selengkapnya (buku_partner_nop_10_view.xml):

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

<data>

<record model="ir.ui.view" id="view_partner_form"> <field name="name">res.partner.form</field> <field name="model">res.partner</field>

<field name="inherit_id" ref="buku_partner_nop_7.view_partner_form"/> <field name="arch" type="xml">

<field name="title" position="after"> <field name="buku_field_19" on_change="onchange_buku_field_19(buku_field_19)"/> </field> </field> </record> </data> </openerp>

Dan, berikut adalah definisi fungsi yang dipanggil, dalam file buku_partner_nop_10.py: from openerp.osv import orm

class res_partner(orm.Model): _name = 'res.partner' _inherit = 'res.partner'

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

ret['warning'] = {

'title': 'Pesan',

'message': 'Isi field buku_field_19 adalah %s' % (buku_field_19),

} return ret

Apa yang kita lakukan adalah menambahkan satu field, dengan atribut on_change, dengan nilai statement pemanggilan fungsi on change, lengkap dengan argumen berupa nama field. Nama field harus didefinisikan dalam view.

<field name="buku_field_19" on_change="onchange_buku_field_19(buku_field_19)"/>

Fungsi yang dipanggil setidaknya harus menerima argumen cr, uid, ids sebagaimana method lain (seperti dibahas pada Bab 4), apa yang ingin kita lewatkan, dan sebuah context (sebagaimana disarankan, disinggung pada Bab 4). Fungsi tersebut dapat merujuk ke record lain yang telah tersimpan dalam database.

def onchange_buku_field_19(self, cr, uid, ids, buku_field_19, context=None):

Nilai kembalian fungsi, sebuah dictionary, akan menentukan apa yang akan dilakukan sesuai key: • domain: dictionary berupa domain {field: domain}.

• value: dictionary berupa nilai field baru: {field: value}. Ini bisa lebih dari satu field, sebagaimana dibahas pada contoh berikutnya. Dapat memicu pemanggilan fungsi on change pada field lain, apabila didefinisikan.

• warning: dictionary dengan key title (judul) dan message (pesan), yang digunakan untuk menampilkan pesan. Ini adalah yang kita lakukan dalam contoh ini.

ret = {}

ret['warning'] = {

'message': 'Isi field buku_field_19 adalah %s' % (buku_field_19),

} return ret

Catatan: fungsi on change dapat digunakan pada saat record sedang dibuat dan belum disimpan pada database. Fungsi ini dapat membaca dari database, namun tidak seharusnya menulis ke database.

Sama seperti sebelumnya, dalam contoh ini, kita turunkan view dari

buku_partner_nop_7.view_partner_form dan modul juga membutuhkan buku_partner_nop_7. File __openerp__.py dalam modul:

{

'name': 'Partner 10', 'version': '1.0', 'author': 'noprianto',

'description': 'form view (partner), on change 1', 'category': 'Buku',

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

'data': ['buku_partner_nop_10_view.xml'], }

File __init__.py dalam modul:

Dalam dokumen DASAR DASAR OPENERP SISI TEKNIKAL DAN CO (Halaman 101-107)

Dokumen terkait