Penggunaan System Parameter pada Odoo

System parameter pada odoo adalah suatu model dengan format key value pairs yang digunakan untuk menyimpan pengaturan aplikasi. System parameter hanya digunakan untuk menyimpan pengaturan saja, penerapannya harus di-koding secara manual di tiap model sesuai kebutuhan.

Model dari system parameter adalah ir.config_parameter. System parameter biasanya digunakan untuk mengaktifkan atau menonaktifkan suatu fitur, menyimpan nilai default dll. Karena system parameter hanya untuk menyimpan konfigurasi saja, tidak secara spesifik menentukan batasan penggunaanya, maka kita bisa menggunakan system parameter secara bebas untuk apapun di aplikasi odoo kita.

Membuat System Parameter

Ada beberapa cara untuk membuat dan mengisi nilai system parameter. Pertama kita bisa membuatnya lewat user interface. Caranya login sebagai administrator, masuk mode debug kemudian masuk menu Setting >> Technical >> Parameters >> System Parameters. Kemudian klik tombol Create.

Pada field key kita bisa mengisi dengan text apapun, asalkan unik per database. Usahakan untuk selalu menggunakan huruf kecil dan hindari spasi atau special character.

Pada field value tipe datanya adalah text sehingga kita bisa mengisi field ini dengan nilai apapun asalkan kita bisa mengolahnya pada python. Saran saya, isi field ini dengan text dalam format integer, comma sparated value, atau JSON tanpa spasi, jika kita ingin mengolah field ini lebih lanjut dengan python.

Cara kedua adalah dengan cara membuat system parameter dari module, sehingga saat module tersebut diinstall, system parameter sudah otomatis dibuat, user tidak perlu membuatnya secara manual. Berikut ini contohnya

<record id="allowed_warehouse_parameter" model="ir.config_parameter">
    <field name="key">allowed_warehouse</field>
    <field name="value">2,5,9</field>
</record>

Selain itu kita juga bisa menempatkan system parameter di form Configuration atau form Setting, sehingga lebih mudah diakses oleh user.

Caranya, pertama kita harus buat model yang inherit ke model res.config.settings. Kemudian buat field dengan type data Char dengan field parameter config_parameter seperti dibawah ini.

# -*- coding: utf-8 -*-

from odoo import api, fields, models, _

class ResConfigSettings(models.TransientModel):
    _inherit = 'res.config.settings'

    allowed_warehouse = fields.Char(string='Allowed Warehouse', config_parameter='allowed_warehouse_parameter')

Kemudian masukkan field tersebut kedalam form Configuration, dalam contoh kasus ini saya akan memasukkan field diatas kedalam form Sale Configuration.

<record id="res_config_settings_view_form" model="ir.ui.view">
    <field name="name">res.config.settings.view.form.inherit.sale</field>
    <field name="model">res.config.settings</field>
    <field name="priority" eval="10"/>
    <field name="inherit_id" ref="sale.res_config_settings_view_form" />
    <field name="arch" type="xml">
        <xpath expr="//div[@id='sale_ebay']" position="after">
            <h2 class="mt32">New Configuration</h2>
            <div class="row mt16 o_settings_container">
                <div class="col-12 col-lg-6 o_setting_box">
                    <div class="o_setting_right_pane">
                        <label for="allowed_warehouse"/>
                        <div class="text-muted">
                            <field name="allowed_warehouse" />
                        </div>                                
                    </div>
                </div>
            </div>
        </xpath>
    </field>
</record>

Saat kita masuk menu Sales >> Configuration >> Settings kita bisa mengisi field diatas seperti pada gambar dibawah ini. Jika kita klik Save maka apa yang kita isi akan disimpan di model ir.config_parameter atau system parameter.

Membaca System Parameter

Untuk membaca system parameter kita cukup memanggil method get_param dari model ir.config_parameter. Argument pertama adalah key dari system parameter yang ingin kita akses, argument kedua bersifat opsional, yaitu nilai default yang akan direturn jika key dari system parameter yang kita akses tidak ada di database. Berikut ini adalah contoh penggunaan system parameter untuk membatasi akses warehouse di sales order dengan cara override method create dan write

# -*- coding: utf-8 -*-

from odoo import api, fields, models, exceptions, _

class SaleOrder(models.Model):
    _inherit = 'sale.order'

    @api.model
    def create(self, vals):
        # baca system parameter dengan key 'allowed_warehouse'
        # jika tidak ada akan return string kosong
        # kemudian kita split berdasarkan karakter koma agar jadi list

        allowed_warehouse = self.env['ir.config_parameter'].get_param('allowed_warehouse', '').split(',')
        
        # karena system parameter disimpan dalam bentuk teks kita ubah jadi integer dulu
        allowed_warehouse = list(map(lambda x: int(x), allowed_warehouse))

        # kita cek field warehouse yang di pilih user ada di daftar warehouse yang diperbolehkan atau tidak

        if vals.get('warehouse_id', False) and vals.get('warehouse_id', False) not in allowed_warehouse:
            raise exceptions.ValidationError('Anda tidak boleh membuat Sale Order dengan warehouse ini !')


        return super(SaleOrder, self).create(vals)


    def write(self, vals):
        # baca system parameter dengan key 'allowed_warehouse'
        # jika tidak ada akan return string kosong
        # kemudian kita split berdasarkan karakter koma agar jadi list

        allowed_warehouse = self.env['ir.config_parameter'].get_param('allowed_warehouse', '').split(',')

        # karena system parameter disimpan dalam bentuk teks kita ubah jadi integer dulu
        allowed_warehouse = list(map(lambda x: int(x), allowed_warehouse))

        # kita cek field warehouse yang di pilih user ada di daftar warehouse yang diperbolehkan atau tidak

        if vals.get('warehouse_id', False) and vals.get('warehouse_id', False) not in allowed_warehouse:
            raise exceptions.ValidationError('Anda tidak boleh membuat Sale Order dengan warehouse ini !')


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

Daftar warehouse yang boleh dipakai di sales order, id atau primary key-nya dimasukkan kedalam system parameter dengan key allowed_warehouse, dengan tanda koma sebagai pemisah, misal 2,5,9. Nantinya value dari system parameter ini kita ubah menjadi list, kemudian saat user membuat atau mengubah sales order kita cek, warehouse yang di pilih user ada dalam daftar atau tidak. Jika tidak kita tampilkan error seperti dibawah ini.

Mengubah Value System Parameter

Untuk mengubah value dari system parameter kita bisa menggunakan method set_param. Argument pertama adalah key dari system parameter yang akan kita ubah. Argument kedua adalah value-nya. Berikut ini adalah contoh kode mengubah value dari system parameter untuk mencatat berapa banyak Sale Order yang dihapus.

def unlink(self):        
    for rec in self:
        deleted = int(self.env['ir.config_parameter'].get_param('deleted_sale_order', '0')) + 1
        self.env['ir.config_parameter'].set_param('deleted_sale_order', deleted)

    return super(SaleOrder, self).unlink()

Ada baiknya anda juga tahu beberapa system parameter default odoo. Yang pertama adalah web.base.url. Isi system parameter ini dengan alamat server anda, misal https://ngasturi.id:8069. System parameter ini digunakan sebagai dasar saat kita membuat sebuah url ke server kita. Misal saat kita membuat email template dengan kode seperti ini

<p>
    Follow <a href="${'/my/order'}"> this link </a> to see your order detail
</p>

Saat customer menerima email, href pada kode diatas akan jadi https://ngasturi.id:8069/my/order secara otomatis. Sehingga saat kita ganti domain kita tidak perlu mengubah kodingan email template.

System parameter ini juga digunakan sebagai alamat untuk me-load file bootstrap dan css yang digunakan pada report. Jadi jika pada report pdf anda tampilannya kacau, bisa jadi ada yang salah dengan settingan system parameter ini.

Ada kalanya system parameter web.base.url valuenya bisa berubah, tanpa disadari. Untuk mencegah hal ini ada baiknya untuk menambahkan system parameter web.base.url.freeze dengan nilai True.

Download source code

Tulisan Serupa

Leave a Reply

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