Penggunaan Context pada Odoo

Context pada odoo adalah sebuah python dictionary yang biasanya digunakan sebagai penanda untuk mematikan atau menyalakan sebuah fitur. Dengan context kita bisa mengatur sebuah model memiliki fitur yang berbeda jika dibuka dari menu yang berbeda. Sebagai contoh misal kita memiliki master product seperti gambar dibawah ini.

Perhatikan field Internal Reference pada master product diatas. Jika kita membuat Sales Quotation, Internal Reference tersebut akan ditampilkan di samping nama product. Seperti pada gambar dibawah ini.

Internal Reference pada product bisa diatur tampil atau tidak dengan menggunakan context. Perhatikan potongan kode dari source code asli berikut ini.

def name_get(self):
    # TDE: this could be cleaned a bit I think

    def _name_get(d):
        name = d.get('name', '')
        code = self._context.get('display_default_code', True) and d.get('default_code', False) or False
        if code:
            name = '[%s] %s' % (code,name)
        return (d['id'], name)

Kode diatas terdapat di module product file models/product.py. Dari kode diatas terlihat jika context display_default_code bernilai True atau tidak ada, dan default_code ada nilainya, maka Internal Reference (default_code) akan ditambahkan di samping nama product. Sekarang mari kita test penggunaan context display_default_code tersebut.

Pertama masuk dalam mode debug. Buka salah satu form Sales Quotation. Pada navbar cari icon serangga, kemudian cari menu Edit Action. Pada field Context Value tambahkan context display_default_code dengan nilai False. Seperti pada gambar dibawah ini.

Context ditulis dalam format Python Dictionary, dimana mirip dengan JSON, jadi pastikan penulisannya benar. Klik Save kemudian refresh browser. Seharusnya Internal Reference sudah tidak ditampilkan, seperti pada gambar dibawah ini.

Karena context display_default_code hanya ditambahkan di action Sale Quotation, maka saat buka form Sale Order atau Purchase Order seharusnya Internal Reference tetap tampil.

Context display_default_code diatas adalah context yang spesifik, hanya bisa digunakan untuk mengatur tampilan master product. Odoo juga memiliki context yang bersifat umum yang bisa digunakan untuk semua model. Berikut ini adalah contoh penggunaan context yang bisa diterapkan di semua model.

Mengatur nilai default suatu field

Misal kita memiliki customer dengan id 12. Dengan menggunakan context kita bisa mengatur saat menekan tombol Create pada Sale Quotation field customer otomatis akan diisi nama customer dengan id 12 tersebut.

Caranya, masih dalam mode debug, klik tombol dengan icon serangga kemudian klik Edit Action. Kemudian tambahkan context dengan format default_ diikuti nama field. Kemudian diikuti nilai default yang diinginkan. Seperti pada gambar dibawah ini.

Mengatur default filter list view

Dengan context kita juga bisa mengatur default filter yang aktif saat buka list view. Untuk melihat daftar filter yang tersedia pada action list view saat ini, pada icon serangga klik Edit Control Panel View pada odoo 13 atau Edit Search View pada versi dibawah 13, kemudian cari xml dengan tag filter.

Kemudian pada form Edit Action tambahkan context dengan format search_default_ diikuti nama filter. Kemudian beri nilai 1 atau True. Seperti pada gambar dibawah ini.

Mengatur default view

Jika suatu model memiliki 2 view seperti pada model res.partner seperti pada gambar dibawah ini

Kita bisa mengatur view mana yang ditampilkan dengan cara menambahkan context form_view_ref atau tree_view_ref tergantung jenis view yang anda inginkan kemudian diikuti external id dari view yang ingin digunakan, seperti pada kode dibawah ini.

<field name="partner_id" context="{'form_view_ref': 'base.view_partner_short_form'}" />

Saat kita klik field partner_id tersebut maka form base.view_partner_short_form akan ditampilkan. Jika kita tidak mengatur view lewat context, view dengan sequence lebih kecil-lah yang ditampilkan.

Context juga bisa digunakan pada python. Untuk mendapatkan context yang dibawa dari user interface atau method lain kita bisa menggunakan kode dibawah ini.

current_context = self._context
print(current_context)

Karena context adalah suatu python dictionary, kita bisa mengecek context yang kita harapkan ada atau tidak dengan kode dibawah ini

if 'my_context' in self._context:
	do_something()

Atau lebih aman dengan menggunakan nilai default seperti dibawah ini.

if self._context.get('my_context', False):
	do_something()

Dengan kode diatas jika context yang kita harapkan tidak ada maka akan return False. Jika ada akan return nilai sebenarnya.

Context adalah frozen dictionary sehingga kita tidak bisa langsung menambahkan context baru. Kode dibawah ini akan menyebabkan error.

self._context['my_context'] = 'test'

Jadi kita perlu menampung context tersebut terlebih dahulu, kemudian kita tambahkan context yang baru. Seperti dibawah ini

current_context = dict(self._context)
current_context['my_context'] = 'test'

Kemudian panggil method with_context setelah model diikuti method sebenarnya. Seperti dibawah ini

current_context = dict(self._context)
current_context['my_context'] = 'test'

self.env['res.partner'].with_context(current_context).search([])

Perlu diingat saat memanggil method with_context dari method super, method with_context harus dipanggil setelah model atau object, dalam hal ini adalah self. Jika tidak akan mengakibatkan error seperti kode dibawah ini

def write(self, vals):
	current_context = dict(self._context)
	current_context['my_context'] = 'test'

	return super(SaleOrder, self).with_context(current_context).write(vals)

Yang benar seharusnya seperti ini

def write(self, vals):
	current_context = dict(self._context)
	current_context['my_context'] = 'test'

	return super(SaleOrder, self.with_context(current_context)).write(vals)
Tulisan Serupa

Leave a Reply

Your email address will not be published. Required fields are marked *