Odoo khususnya class Model memiliki banyak method yang dapat anda overide untuk mendukung logic program anda. Misal method create dan write untuk mengatur proses create dan update data di database, method search dan read untuk mengatur proses pembacaan data dari database dan lain-lain.
Pada tulisan ini kita akan membahas bagaimana meng-override method-method tersebut dan kemungkinan penggunaannya. Kita mulai dari method create, write dan unlink.
Create
Method ini dipanggil saat kita akan memasukkan data ke database. Parameter yang dimasukkan adalah values. Di parameter inilah semua data yang akan dimasukkan ke database berada. Kita bisa menambah atau mengurangi nilai values ini. Perlu anda ingat method create harus return record di database yang baru saja dimasukkan.
Umumnya method create menggunakan decorator @api.model. Silakan Lihat disini untuk informasi decorator yang lebih detail
Pada method create sebelum anda menjalankan method super belum ada data yang disimpan di database. Jadi variabel self tidak menyimpan record / data dari database. Jika anda ingin mengkases data akses langusng dari parameter values, atau anda jalankan method super dan simpan hasilnya pada satu variabel, pada variabel itulah data dari database disimpan.
Write
Method ini dipanggil saat kita ingin mengubah data di database. Saat menjalankan method ini variabel self sudah mengandung record dari database. Tentu saja selama anda belum memanggil method super, data pada variabel self adalah data lama. Method ini menggunakan decorator @api.multi dan return nilai berupa True atau False, bukan record.
Update Penting !!!
Sejak odoo versi 13, decorator @api.multi sudah tidak digunakan.
# di versi odoo 12 kebawah kita menulis method write seperti ini @api.multi def write(self, values): # letakkan kode lainnya disini # karena pada versi odoo 13 keatas decorator @api.multi sudah tidak digunakan, kita cukup menulis seperti ini def write(self, values): # letakkan kode lainnya disini
Unlink
Method ini dipanggil saat kita ingin menghapus data dari database. Decorator yang digunakan adalah @api.multi
Berikut ini adalah contoh penggunaaan method Create, Write dan Unlink
# -*- coding: utf-8 -*- from odoo import api, fields, models, exceptions, _ class MyService(models.Model): _name = 'my.service' _description = 'Service' _inherit = ['portal.mixin', 'mail.thread', 'mail.activity.mixin'] name = fields.Char('Nomor Service', track_visibility='onchange') pelanggan = fields.Many2one('res.partner','Pelanggan', track_visibility='onchange') tanggal = fields.Date('Tanggal') service_detail = fields.One2many('my.service.detail', 'service_id') @api.model def create(self, values): # print values agar kita bisa lihat data apa saja yang terdapat didalamnya print(values) # check nomor service sudah diisi atau belum jika belum diisi, isi secara manual if not values.get('name',False): values['name'] = 'NEW' # check apakah service detail ada yang garansi atau tidak garansi = False if values.get('service_detail', []): for detail in values.get('service_detail', []): if detail[2].get('garansi', False): garansi = True # jika garansi check user yang login saat ini punya group group_prosess_garansi atau tidak if garansi and not self.env.user.has_group('tutorial_create_white.group_prosess_garansi'): raise exceptions.ValidationError('Anda tidak boleh membuat penerimaan service garansi') # jalankan method super dan simpan record yang baru saja dimasukkan kedalam variabel # id ini bisa anda gunakan untuk membuat perintah kerja service res = super(MyService, self).create(values) # siapkan values sebagai data yang akan dimasukkan sebagai Perintah Kerja Service perintah_kerja_values = { 'service_id': res.id, # id dari penerimaan service 'teknisi_id': 7, # ini saya hardcode biar simple, dalam aplikasi nyata tentu saja anda harus cari dari database 'prioritas': 'Urgent' if garansi else 'Normal' } # buat Perintah Kerja Service dengan data yang sudah dibuat diatas # pada kode ini kita masukkan context, agar perintah kerja hanya bisa dibuat dari penerimaan service saja self.env['my.service.work.order'].with_context({'create_from_penerimaan_service':1}).create(perintah_kerja_values) # jangan lupa return record return res @api.multi def write(self, values): # print values agar kita bisa lihat data apa saja yang terdapat didalamnya print(values) # jalankan method super dulu res = super(MyService, self).write(values) # kita cek ada detail yang garansi atau tidak garansi = False for detail in self.service_detail: if detail.garansi : garansi = True # check hak akses garansi if garansi and not self.env.user.has_group('tutorial_create_white.group_prosess_garansi'): raise exceptions.ValidationError('Anda tidak boleh edit penerimaan service garansi') # kita juga perlu update perintah kerja # kita cari dulu perintah kerja yang sesuai perintah_kerja = self.env['my.service.work.order'].search([('service_id', '=', self.id)]) if perintah_kerja: perintah_kerja.with_context({'write_from_penerimaan_service':1}).write({ 'prioritas': 'Urgent' if garansi else 'Normal' }) return res class MyServiceDetail(models.Model): _name = 'my.service.detail' _description = 'Service Detail' _inherit = ['portal.mixin', 'mail.thread', 'mail.activity.mixin'] product = fields.Many2one('product.product', 'Product', track_visibility='onchange') keluhan = fields.Char('Keluhan', track_visibility='onchange') garansi = fields.Boolean('Garansi') service_id = fields.Many2one('my.service') class ServiceOrder(models.Model): _name = 'my.service.work.order' _description = 'Service Order' _inherit = ['portal.mixin', 'mail.thread', 'mail.activity.mixin'] name = fields.Char(related='service_id.name') service_id = fields.Many2one('my.service', string="Penerimaan Service") teknisi_id = fields.Many2one('res.users', string="Teknisi") prioritas = fields.Char('Prioritas') @api.model def create(self, values): # disini kita membatasi agar tidak boleh membuat perintah kerja secara manual # kita bisa menggunakan context # kita check dulu ada context create_from_penerimaan_service atau tidak # jika tidak ada kirim pesan ke user if 'create_from_penerimaan_service' not in self._context: raise exceptions.ValidationError('Anda tidak boleh membuat perintah kerja secara manual') # kita jalankan method super return super(ServiceOrder, self).create(values) @api.multi def write(self, values): # sama seperti method create disini kita membatasi agar tidak boleh membuat perintah kerja secara manual # kita check dulu ada context write_from_penerimaan_service atau tidak # jika tidak ada kirim pesan ke user if 'write_from_penerimaan_service' not in self._context: raise exceptions.ValidationError('Anda tidak boleh mengubah perintah kerja secara manual') # kita jalankan method super return super(ServiceOrder, self).write(values) @api.multi def unlink(self): # kita tidak ingin perintah kerja dihapus, jadi jika anda yang ingin menghapus kita kirim pesan ke user raise exceptions.ValidationError('Anda tidak boleh manghapus perintah kerja')
4 Replies to “Odoo Overriding Method Create, Write dan Unlink”
bagus artikel odoonya
bisa buatin program pake odoo?
Bisa
boleh minta wa?
Cek email gan