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 odoo 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, lebih tepatnya di 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 kita membuka 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 beberapa 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, misal partner_id. Kemudian diikuti nilai default yang diinginkan. Seperti pada gambar dibawah ini.
Pada database saya, customer dengan id 12 bernama Ready Mat.
Maka saat saya klik tombol Create pada form Sales Quotation, secara otomatis field customer akan diisi dengan nama Ready Mat.
Mengatur default filter list view
Dengan context kita juga bisa mengatur default filter yang aktif saat membuka 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.
Pilih salah satu filter yang anda ingin secara otomatis aktif saat membuka list view, misal filter_create_date.
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. Kemudian refresh browser.
Saat anda membuka list view sales quotation, secara otomatis filter filter_create_date akan aktif, seperti pada gambar di bawah ini.
Mengatur default view
Jika suatu model memiliki lebih dari satu view seperti pada model res.partner, yang terlihat 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 akan ditampilkan.
Untuk melihat daftar view yang dimiliki suatu model, masih dalam mode debug, buka menu Settings >> Technical >> User Interface >> Views. Kemudian lakukan filter berdasarkan nama model dan jenis tampilan seperti pada gambar di atas. Klik salah satu view untuk melihat detail informasinya, termasuk External ID dan Sequence.
Berikut ini adalah tampilan master customer saat kita klik field Customer di form Sales Quotation, sebelum di beri context seperti kode diatas.
Sedangkan tampilan di bawah ini adalah sesudah diberi context.
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 nama model atau record, diikuti method sebenarnya. Seperti dibawah ini.
current_context = dict(self._context) current_context['my_context'] = 'test' self.env['res.partner'].with_context(current_context).do_something(self.order.id)
Selanjutnya di model dan method terkait, kita bisa membuat logic sesuai context yang di bawa oleh method do_something di atas.
class ResPartner(models.Model) _inherit = 'res.partner' def do_something(self, order_id): if self._context.get('my_context','test') == 'test': self.do_test(order_id) else: self.do_prod(order_id)
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)
Context hanya digunakan sebagai penanda saja. Penggunaan real-nya tentu perlu disesuaikan dengan kebutuhan aplikasi odoo anda.