Membuat Module Odoo (Bagian 3 – Model)

Jika anda pernah memakai PHP Framework seperti Yii atau laravel, anda sudah pasti familiar dengan istilah model dan orm. Ya konsep model atau orm di Odoo mirip dengan konsep model di PHP Framework pada umumnya. Intinya model mengatur tentang bagaimana data disimpan, bagaimana data dicari, ditampilkan dll. Tentu saja tidak sama persis, ada beberapa perbedaan, dimana anda perlu menyesuaikan.

Ada 3 model pada odoo, yaitu concrete model, transient model dan absctract model. Berikut ini penjelasan dan bagaimana menggunakannya.

  1. Concrete Model

    Concrete Model adalah model yang datanya disimpan di database. Jika anda membuat model jenis ini, Odoo secara otomatis akan membuat tabel pada database, jika module anda diinstall. Berikut ini adalah contoh concrete model. Lihat pada bagian extend class.

    from odoo import api, fields, models, _
    
    class AccountInvoice(models.Model):
    
  2. Transient Model

    Transient Model adalah model yang datanya tidak tersimpan secara permanen. Model jenis ini datanya bisa jadi tidak pernah disimpan oleh Odoo, atau disimpan tapi setelah beberapa waktu akan dihapus oleh Odoo. Gunakan model jenis ini untuk proses sementara, misal sebagai jembatan (wizard) antar concrete model. Contoh penggunaan model ini bisa anda lihat di module sales. Dimana jika anda akan membuat Invoice anda akan dihadapkan pada sebuah modal, yang berisi beberapa pilihan. Modal ini dibuat dari Transient Model. Berikut ini contoh transient model.

    from odoo import api, fields, models, _
    
    class AccountInvoiceConfirm(models.TransientModel):
    
  3. Absctract Model

    Menurut Odoo model ini adalah super class, yang diinherit oleh banyak class. Tapi penggunaanya saya juga agak bingung :). Tapi biasanya model ini digunakan jika anda ingin mengatur report dalam bentuk PDF / Html lewat python. Karena Odoo memungkinkan kita untuk membuat report PDF / Html lewat script xml saja. Misal jika anda akan download invoice dalam bentuk PDF, jika customer tidak berada pada satu wilayah dengan anda maka akan muncul pesan “Anda tidak punya hak akses” dan jika berada satu wilayah dengan anda, maka akan tampil report PDF seperti biasa. Berikut ini contoh abstract model.

    from odoo import api, fields, models, _
    
    class report_sale_order(models.AbstractModel):
     _name = 'report.sale.report_saleorder'
    
Property Pada Model

Model pada dasarnya adalah sebuah python class. Jadi sudah pasti ada beberapa property default. Berikut ini beberapa property default suatu Odoo model yang sebaiknya anda tahu.

  1. _name atau _inherit

    Property ini wajib ada pada Odoo model. Gunakan _name jika anda ingin membuat tabel baru pada database (membuat model baru). Jika anda menggunakan _name pastikan tidak ada model lain dengan nama yang sama, baik pada module buatan anda sendiri atau module lain, termasuk module bawaan Odoo. Contoh penggunaannya adalah jika anda ingin menyimpan data makelar secara lengkap, misal nama makelar, alamat makelar dll dalam satu tabel database, sedangkan di system Odoo anda belum ada model makelar, maka anda bisa membuat model dengan property _name. Berikut ini adalah contoh model dengan property _name

    from odoo import api, fields, models, _
    
    class MyMakelar(models.Model):
        _name = "my.makelar"
    

    Gunakan _inherit jika anda ingin mengubah fungsi suatu model (sebelumnya sudah ada model dengan nama yang sama). Jika anda menggunakan _inherit pastikan sudah ada model dengan nama yang sama pada system Odoo anda, jika tidak akan terjadi error. Misal anda ingin menyimpan nama makelar pada transaksi penjualan. Pada transaksi ini nama makelar berupa text dan diinput secara bebas oleh sales. Maka anda tidak perlu membuat model baru, cukup inherit model sale.order dengan property _inherit. Berikut ini adalah contoh model dengan property _inherit

    from odoo import api, fields, models, _
    
    class MySale(models.Model):
        _inherit = "sale.order"
    

    Anda juga bisa menggunakan property _name dan _inherit secara bersamaan, seperti contoh kode dibawah ini.

    from odoo import api, fields, models, _
    
    class MyCustomSale(models.Model):
        _inherit = "sale.order"
        _name = "sale.order.custom"
    

    Dengan kode diatas anda akan memiliki 2 model (tabel) dengan kolom yang sama tapi dengan data yang berbeda, karena kedua model ini (sale.order dan sale.order.custom) tidak terhubung. Hanya field / kolom-nya saja yang sama.

    Nama model (bukan nama class) sebaiknya tidak mengandung spasi. Dan jika terdiri dari banyak kata hubungkan dengan tanda titik (.) misal sale.order. Jika anda ingin mengolah data lewat query ubah tanda titik tadi menjadi underscore, misal select * from sale_order. Operasi pengolahan data akan dibahas pada bagian yang lain.

  2. _description

    Property ini digunakan untuk memberi identitas model kita. Anda bisa menggunakan spasi, dan gunakan kata / kalimat yang mudah dipahami. Property ini tidak wajib ada, karena secara default nilainya sama dengan property _name. Tapi saya sarankan untuk diisi agar lebih memudahkan user yang bukan programmer. Contoh penulisannya :

    from odoo import api, fields, models, _
    
    class MyCustomSale(models.Model):
        _name = "sale.order.custom"
        _description = "Sale Order Door to Door"
    
  3. _order

    Property ini digunakan untuk mengatur bagaimana data diurutkan secara default, mirip seperti fungsi order di sql. Gunakan tanda koma (,) untuk memisahkan fungsi order, seperti dibawah ini

    from odoo import api, fields, models, _
    
    class MyCustomSale(models.Model):
        _name = "sale.order.custom"
        _description = "Sale Order Door to Door"
        _order = "create_date DESC, sales_name ASC"
    
  4. _sql_constraints

    Property ini digunakan untuk menulis constraint database. Misal field harus unik, berupa primary key dll. Contoh penggunaannya :

    from odoo import api, fields, models, _
    
    class MyCustomSale(models.Model):
        _name = "sale.order.custom"
        _description = "Sale Order Door to Door"
        _order = "create_date DESC, name ASC"
    
        _sql_constraints = [('code_uniq', 'unique(code)', _('Kode sale order tidak boleh sama'))]   
    
  5. Fields

    Fields adalah property yang namanya bebas, tetapi type datanya harus extends dari model Fields. Nama fields umumnya akan diubah oleh Odoo jadi nama kolom didatabase, jadi jangan gunakan spasi. Berikut ini adalah contoh penulisan fields. Pembahasan lebih lanjut mengenai fields akan ditulis pada bagian yang lain.

    from odoo import api, fields, models, _
    
    class MyCustomSale(models.Model):
        _name = "sale.order.custom"
        _description = "Sale Order Door to Door"
        _order = "create_date DESC, name ASC"
    
        code = fields.Char('Kode Transaksi')
        sudah_dibayar = fields.Boolean('Sudah Dibayar')
    
        _sql_constraints = [('code_uniq', 'unique(code)', _('Kode sale order tidak boleh sama'))]   
    

Ok, diatas adalah beberapa property yang ada di Odoo model. Tentu masih ada yang lainnya, tapi tidak sering digunakan.

Tulisan Serupa

2 Replies to “Membuat Module Odoo (Bagian 3 – Model)”

Leave a Reply