Technical Documentation Odoo 14 - Part 1
Daftar Isi
A. MODEL ............................................................................................................................. 2
1. Model .............................................................................................................................2
2. TransientModel ..............................................................................................................3
3. AbstractModel ............................................................................................................. 3
B. ATTRIBUTE CLASS .......................................................................................................... 4
1. Auto ............................................................................................................................... 4
2. Log Access .................................................................................................................... 5
3. Table .............................................................................................................................. 5
4. Name ..............................................................................................................................5
5. Description .....................................................................................................................6
6. Inherit .............................................................................................................................6
7. Inherits ........................................................................................................................... 6
a. Field related.............................................................................................................. 6
b. Field related..............................................................................................................6
8. Rec Name........................................................................................................................ 7
9. Order................................................................................................................................ 7
10. Sql Constraints .............................................................................................................7
C. FIELD.....................................................................................................................................8
1. Boolean............................................................................................................................ 8
2. Char................................................................................................................................. 8
3. Float................................................................................................................................. 8
4. Integer.............................................................................................................................. 8
5. Binary.............................................................................................................................. 8
6. Html................................................................................................................................. 8
7. Image............................................................................................................................... 9
8. Monetary..........................................................................................................................9
9. Selection.......................................................................................................................... 9
10. Text................................................................................................................................ 9
11. Date................................................................................................................................9
13. Many2one...................................................................................................................... 9
14. One2many......................................................................................................................9
15. Many2many................................................................................................................... 9
16. Reference..................................................................................................................... 10
17. Many2oneReference.................................................................................................... 10
D. ATTRIBUTE FIELD........................................................................................................... 10
1. String (string).................................................................................................................10
2. Help (string)...................................................................................................................11
3. Invisible (boolean)......................................................................................................... 11
4. Readonly (boolean)........................................................................................................11
5. Required (boolean)........................................................................................................ 11
6. Index (boolean)..............................................................................................................11
7. Default (value)............................................................................................................... 11
8. States (dictionary)..........................................................................................................12
9. Groups (string)...............................................................................................................12
10. Company Dependent (boolean)................................................................................... 12
11. Copy (boolean)............................................................................................................ 12
12. Store (boolean)............................................................................................................ 12
13. Group Operator (string)............................................................................................... 12
14. Group Expand (string)................................................................................................. 13
15. Compute (string)..........................................................................................................13
16. Inverse (string).............................................................................................................13
17. Search (string)..............................................................................................................13
18. Related (string)............................................................................................................ 14
20. Translate (boolean)...................................................................................................... 14
21. Digits (tuple(integer, integer))..................................................................................... 14
22. Max Width (integer).................................................................................................... 15
23. Max Height (integer)................................................................................................... 15
24. Selection (list(tuple(string, string)))............................................................................ 15
25. Selection Add (list(tuple(string, string))).................................................................... 15
26. Comodel Name (string)............................................................................................... 15
27. Domain (list(tuple(value, value)).................................................................................15
28. Context (dictionary).....................................................................................................16
29. Ondelete (string).......................................................................................................... 16
30. Auto Join (boolean)..................................................................................................... 16
31. Delegate (boolean).......................................................................................................16
32. Inverse Name (string).................................................................................................. 17
33. Limit (integer)..............................................................................................................17
E. FIELD METHOD.................................................................................................................18
1. Round()..........................................................................................................................18
2. Is Zero()......................................................................................................................... 18
3. Compare()...................................................................................................................... 18
4. To Date()........................................................................................................................18
5. To Datetime()................................................................................................................ 18
6. Add()..............................................................................................................................19
7. Subtract()....................................................................................................................... 19
8. Context Today().............................................................................................................19
9. End Of().........................................................................................................................19
10. Start Of()......................................................................................................................19
11. To String()................................................................................................................... 19
12. Today()........................................................................................................................ 20
13. Now()...........................................................................................................................20
F. AUTOMATIC FIELD ........................................................................................................ 20
G. SPESIAL FIELD..................................................................................................................20
H. DECORATORS................................................................................................................... 21
I. ENVIRONMENTS................................................................................................................22
J. ORM METHODS..................................................................................................................23
1. Create().......................................................................................................................... 24
2. Copy()............................................................................................................................ 24
3. Write()........................................................................................................................... 24
4. Flush()............................................................................................................................24
5. Browse()........................................................................................................................ 24
6. Search()..........................................................................................................................24
7. Unlink()......................................................................................................................... 24
8. Search Count()............................................................................................................... 25
9. Read()............................................................................................................................ 25
K. RECORDSETS OPERATIONS.......................................................................................... 25
L. WIDGET.............................................................................................................................. 26
1. Basic Fields....................................................................................................................26
2. Relational Fields............................................................................................................ 27
3. Special Fields.................................................................................................................28
Bismillah …
Alhamdulillah kita bisa melanjutkan kembali technical documentation berseri ini,
semoga artikel ini bermanfaat khususnya untuk para developer yang baru mengenal
Odoo 14. InsyaAllah kita akan jelaskan secara bertahap dari mulai teorinya sampai
praktek membuat modul sederhana agar menambah pemahaman secara komprehensif.
Bagi yang belum berkenalan dengan python, silahkan mencoba dan mempelajarinya
terlebih dahulu agar sudah memiliki bekal untuk mengikuti technical documentation
ini, yang notabenenya Odoo di kembangkan dengan bahasa pemrograman Python.
Salah satu referensinya bisa kita cek disini :
https://codesaya.com/python/
dan
https://www.codecademy.com/learn/learn-python
Sebagai informasi, penulis memilih Odoo versi genap seperti 8, 10, 12, dan 14. Ada
banyak faktor untuk mengambil keputusan ini, diantaranya :
1. Cepatnya rilis Odoo versi terbaru yaitu setiap tahun
2. Pada umumnya customer tidak terlalu concern terhadap versi tetapi solusi
3. Keterbatasan waktu dan ilmu penulis untuk mempelajari update terbaru
4. Mengikuti versi Ubuntu LTS yang rilis setiap bulan APRIL di tahun yang GENAP
Disamping itu juga, biasanya versi ganjil adalah versi ‘kelinci percobaan’ dan akan di
sempurnakan (stable) pada versi genapnya. Contohnya seperti Odoo 9 adalah versi
peralihan API lama ke baru, sedangkan Odoo 11 versi peralihan python 2.x ke 3.x,
begitu juga dengan Odoo 13 yang banyak merubah konsep dasar modul Accounting
(merge model invoice dan journal entris, sumber cost price, dll) dan lahirnya
modul-modul baru seperti Field Service, Social Marketing, Approval, eLearning,
SMS Marketing, dll. Jadi disana banyak sekali terjadi perombakan baik penambahan
maupun pengurangan.
1
Jadi insyaAllah penulis kedepannya menggunakan versi Odoo yang genap. Setelah
Odoo terbaru rilis maka sebaiknya kita menunggu setidaknya 6 bulan jika ingin
melakukan implementasi, karna jika kita langsung menggunakan versi yang baru rilis,
biasanya masih banyak bug fixing, terjadi perubahan major dengan update
kedepannya seperti nama method, struktur tabel, dll, dan yang terpenting
modul-modul terkait di Apps Odoo masih sedikit yang tersedia.
Odoo dikembangkan dengan framework OpenObject yang sudah menjadi kesatuan
dan tidak bisa dipisahkan. Salah satu fitur penting dari OpenObject adalah ORM
(Object Relational Mapping) yang berfungsi untuk menjadi penghubung antara
pemrograman (python) dan database (postgresql).
Dengan adanya ORM ini, kita dimudahkan untuk berinteraksi dengan database tanpa
perlu menulis syntax SQL Query secara langsung, karna sudah di encapsulasi
(bungkus). Begitu juga dengan konsep OOP seperti object dan class yang bisa kita
gunakan untuk memanipulasi database
Pada pertemuan pertama ini, insyaAllah kita akan membahas teori secara umum ORM
Odoo, seperti Model, Field, Method, dll.
A. MODEL
Model (Object) adalah sebuah struktur dalam database yang fungsinya untuk
menentukan cara sebuah data disimpan, diatur dan dimanipulasi. Sederhananya Model
adalah Table di database. Model Odoo dibuat ketika kita menginherit salah satu dari 3
models dibawah ini :
1. Model
Ini adalah model yang umum dipakai pada Odoo. Setiap class yang menginherite
model ini, maka akan membuat sebuah tabel di database yang akan menyimpan data
secara permanen. Contohnya :
from odoo import api, fields, models, tools, _
2
class SaleOrder(models.Model):
_name = 'name.order'
2. TransientModel
Model ini akan membuat table yang datanya disimpan dalam waktu tertentu dan akan
dihapus secara periodik. Biasanya digunakan untuk wizard, report, dll. Contohnya :
from odoo import api, fields, models, tools, _
class HrDepartureWizard(models.TransientModel):
_inherit = 'hr.departure.wizard'
3. AbstractModel
Model yang menjadi super class (sumber/leluhur/nenek-moyang) dari model-model
yang lain seperti Model dan TransientModel. Model ini tidak membuat table apalagi
data, jadi model ini nanti akan di inherit oleh model lainnya. Contohnya :
from odoo import api, fields, models, tools, _
class HrEmployeeBase(models.AbstractModel):
_name = "hr.employee.base"
Model lain yang menginheritnya bisa seperti ini :
from odoo import api, fields, models, tools, _
class HrEmployee(models.Model):
_name = "hr.employee"
3
_inherit = ['hr.employee.base']
Setiap instan Model yang kita buat adalah Recordset yaitu kumpulan record sebuah
model. Recordset bisa kita akses dengan method browse() atau search() dan bisa juga
dengan akses field. Contoh sebuah recordset table Sale Order dengan 5 record (angka
menandakan id recordnya) :
sale.order(1, 2, 3, 4, 5)
def sebuah_method(self):
# Mencetak Recordset
print(self) # => sebuah.model(1, 2, 3, 4, 5)
# Melakukan Looping Terhadap Recordset
for record in self:
# Mencetak Singletons (Single Record)
print(record) # => sebuah.model(1), lalu sebuah.model(2), lalu
sebuah.model(3)
Recordset merupakan sebuah fitur yang sangat powerfull, dari sini kita bisa
melakukan proses CRUD dan mengakses semua relasi antar table pada sebuah
database.
B. ATTRIBUTE CLASS
Setiap model yang dibuat maka harus melalui sebuah Class seperti contoh diatas.
Sebuah Class memiliki beberapa attribute seperti penjelasan berikut ini.
1. Auto
Attribute ini memiliki nilai boolean yaitu True dan False. Jika True, maka Model
yang dibuat akan membuat sebuah table pada database. Untuk Model dan
TransientModel secara default attribute auto bernilai True, sedangkan
4
AbstractModel bernilai False. Dari sini kita bisa mengetahui kenapa AbstractModel
tidak membuat table pada database
_auto = True
2. Log Access
Attribute ini memiliki nilai boolean yaitu True dan False. Jika True, maka Model
yang dibuat akan membuat 4 field default yaitu :
create_date # Berisi Tanggal pembuatan record
create_uid # Berisi User yang membuat record
write_date # Berisi Tanggal perubahan record
write_uid # Berisi User yang merubah record
Nilai defaultnya sama seperti attribute auto yaitu untuk Model dan TransientModel
secara default bernilai True, sedangkan AbstractModel bernilai False
_log_access = False
3. Table
Berfungsi untuk memberikan nama table pada database yang digunakan oleh
Modelnya. Attribute ini memiliki nilai string dan menggunakan separator underscore
( _ ) antar katanya. Attribute ini jarang digunakan karna biasanya cukup
menggunakan attribute name.
_table = ‘ir_actions’
4. Name
Berfungsi untuk memberikan nama sebuah Model. Jika attribute table tidak dibuat,
maka penamaan table pada database menggunakan attribute name ini. Attribute ini
memiliki nilai string dan pada umumnya menggunakan separator titik ( . ) antar
katanya, akan tetapi akan di replace dengan underscore pada saat pembuatan table di
database
_name = ‘sale.order’
5
5. Description
Berfungsi untuk memberikan keterangan sebuah Model. Biasanya sebagai penjelas
dari attribute name. Attribute ini memiliki nilai string dan menggunakan separator
spasi ( ) antar katanya.
_description = ‘Sale Order’
6. Inherit
Berfungsi untuk menginherit model parent. Dengan menggunakan keyword ini, maka
kita bisa menambahkan/merubah apapun yang kita inginkan ke model parent seperti
field, method, attribute, dll. Attribute ini memiliki nilai string dan menggunakan
separator titik ( . ) antar katanya . InsyaAllah penjelasan detailnya akan dibahas pada
artikel selanjutnya.
_inherit = ‘sale.order’
7. Inherits
Berfungsi untuk membuat delegasi (record) ke model parent. Jika inherit (pewarisan)
kita mengcustom tabel/model parent, maka inherits (delegasi) yang kita lakukan
adalah membuat sebuah field relasi yang mewakili table parent. Maka semua field
table parent akan bisa kita akses pada tabel kita, dan ketika kita membuat record pada
table kita, maka Odoo akan otomatis membuat record yang sama pada tabel parent.
Untuk menggunakan fitur ini, maka kita harus mendeklarasikan attribute ini dan
membuat field relasi many2one ke parent. Konsep inherits memiliki beberapa
kesamaan sebagaimana field related, tetapi dengan perbedaan :
a. Field related : Fieldnya harus kita buat pada model kita. Sedangkan inherits tidak
perlu
b. Field related : Bisa menyimpan datanya pada model kita, sedangkan inherits
datanya di simpan pada model parent.
Attribute ini memiliki nilai dictionary yang isinya key adalah nama model sedangkan
value adalah field many2one.
6
_inherits = {‘sale.order‘: ‘order_id’}
order_id = fields.Many2one(‘sale.order’, ‘Sale Order’, required=True,
ondelete=’cascade’)
8. Rec Name
Berfungsi untuk memberikan label pada sebuah record, defaultnya menggunakan
field name. Jika kita tidak membuat fieldname, maka kita harus menggunakan
attribute ini dan mengisinya dengan field penggantinya. Attribute ini memiliki nilai
string yaitu nama sebuah field
Hal ini (label) akan terlihat jika model kita dijadikan relasi many2one pada model lain
atau judul header pada form view. Maka jika kita tidak memiliki field name dan
attibute _rec_name maka Odoo akan otomatis memberikan label dengan nama model
dan id recordnya (contoh : sale.order,2 ; sale.order,3 ; sale.order,4 ; dll ).
_rec_name = ‘product_id’
9. Order
Berfungsi untuk mengurutkan record data. Hal ini terlihat pada tampilan list/tree view
dan proses searching. Attribute ini memiliki nilai string yaitu nama sebuah field dan
bisa mengandung lebih dari 1 field. Secara default sistem pengurutan menggunakan
ascending, maka jika ingin descending, kita harus menambahkan keyword desc
setelah nama field. Jika tidak dibuat, maka nilai defaultnya adalah field ID.
Attribute ini memiliki nilai string yang isinya adalah value field beserta keterangan
ascending atau descending-nya dan menggunakan separator koma ( , ) antar fieldnya.
_order = “date desc, name, id desc”
10. Sql Constraints
Berfungsi untuk menggunakan constraint yang ada di SQL. Attribute ini memiliki
nilai sebuah List, yang antar elemennya menggunakan sebuah Tuple, setiap tuple
memiliki aturan constraint sendiri.
7
Setiap tuple memiliki 3 elemen yaitu variabel id atau code, fungsi atau syntax
constraintnya dan terakhir adalah pesan errornya. InsyaAllah penjelasan detailnya
akan dibahas di artikel selanjutnya.
_sql_constraints = [(
'code_company_uniq',
'UNIQE (code, company_id)',
'The code of the account must be unique per company !'
)]
C. FIELD
ORM Odoo juga menyediakan banyak field atau column. Diantaranya seperti berikut
ini :
1. Boolean
is_reconciled = fields.Boolean(string=’Is Reconciled’)
2. Char
code = fields.Char(string=’Code’)
3. Float
subtotal = fields.Float(string=’Subtotal’)
4. Integer
quantity = fields.Integer(string=’Quantity’)
5. Binary
favicon = fields.Binary(string=’Company Favicon’)
6. Html
help = fields.Html(string=’Action Description’)
8
7. Image
flag_image = fields.Image(string=’Image’)
8. Monetary
amount_total = fields.Monetary(string=’Total’)
Field monetary membutuhkan field currency_id yang harus many2one ke model
res_currency
9. Selection
state = fields.Selection(string=’Status’, selection=[(‘open’, ‘New’), (‘posted’,
‘Process’)])
10. Text
note = fields.Text(string=’Description’)
11. Date
date_from = fields.Date(string=’Start Date’)
12. Datetime
close_date = fields.Datetime(string=’Close Date’)
13. Many2one
partner_id = fields.Many2one(‘res.partner’, string=’Customer’)
14. One2many
order_line = fields.One2many(‘sale.order.line’, ‘order_id’, string=’Order Lines’)
15. Many2many
invoice_ids = fields.Many2many(‘account.move.line’, ‘sale_order_invoice_rel’,
‘order_line_id’, ‘invoice_line_id’, string=’Invoice’)
Field ini secara tampilan sama seperti field One2many tetapi secara pengisian data
sama seperti field Many2one
9
16. Reference
view_id = fields.Reference(selection=[(‘ir.ui.view’, ‘View’), (‘theme.ir.ui.view’,
‘Theme’)], string=’View’)
Field ini tergolong unik karna menggabungkan sifat antara field Many2one dan
Selection.
17. Many2oneReference
res_id = fields.Many2oneReference(string=’ResourceID’, model_field=’res_model’)
Tampilan dari keseluruhan field-field diatas, terlihat seperti gambar dibawah ini :
D. ATTRIBUTE FIELD
1. String (string) : Label field yang akan dilihat user, jika tidak didefiniskan, maka
nama field aslinya (coding) yang akan dijadikan label. Biasanya langsung di tulis
valuenya, jarang bersama attributenya kecuali kita menggunakan snippet.
10
name = fields.Char(string=’Reference’)
atau
name = fields.Char(’Reference’)
2. Help (string) : Informasi tooltips / hints yang akan dilihat user ketika cursor
didekatkan ke field
opening_debit = fields.Monetary(help=”Opening debit value for this account.”)
3. Invisible (boolean) : Jika diberikan nilai True maka field tidak akan terlihat
password = fields.Char(invisible=True)
4. Readonly (boolean) : Jika diberikan nilai True maka field akan menjadi tidak bisa
diedit
company_id = fields.Many2one(readonly=True)
5. Required (boolean) : Jika diberikan nilai True maka field akan menjadi mandatory
/ wajib diisi
name = fields.Char(required=True)
6. Index (boolean) : Jika diberikan nilai True maka field akan diberikan index pada
database dan mempercepat proses pencarian
date_order = fields.Datetime(index=True)
7. Default (value): Memberikan value awal pada field, bisa berupa method ataupun
value yang sesuai dengan jenis fieldnya
service_type = fields.Selection(default=’manual’)
11
8. States (dictionary) : Memberikan kondisi readonly / required / invisible pada
masing-masing status
name = fields.Char(states={‘open’: [(‘readonly’, False)]})
9. Groups (string) : Memberikan batasan akses kepada sebuah group tertentu
signup_token = fields.Char(groups=”base.group_erp_manager”)
10. Company Dependent (boolean) : Jika diberikan nilai True maka value field akan
menjadi bergantung pada company yang berlaku/berjalan
account_id = fields.Many2one(‘account.account’, company_dependent=True)
11. Copy (boolean) : Jika diberikan nilai True maka nilai field ini bisa di duplikasi
saat duplikasi record. Defaultnya bernilai True untuk normal field dan False untuk
field computed, property, dan field related
name = fields.Char(copy=False)
12. Store (boolean) : Jika diberikan nilai True maka nilai field ini akan disimpan pada
database. Defaultnya bernilai True untuk normal field dan False untuk field computed,
property, dan field related
balance_end = fields.Monetary(compute=’_end_balance’, store=True)
13. Group Operator (string) : Menentukan sebuah value berdasarkan kumpulan dari
semua record (nilainya : avg, sum, min, max, dll) dan hanya akan berfungsi jika
dipanggil oleh methodread_group().
Misal ada sebuah field usia pada table res_partner yang kita berikan
group_operator dengan nilai avg, maka ketika kita panggil dengan method
read_group(), value yang dihasilkan adalah usia rata-rata dari semua data partner.
value = fields.Float(group_operator=”avg”)
12
14. Group Expand (string) : Biasanya field yang menggunakan group_expand ini
dipakai untuk view kanban (attribute default_group_by), dimana field ini digunakan
untuk menentukan mana yang harus di expand (buka/tampil) dan mana yang harus di
fold (lipat/tutup)
stage_id = fields.Many2one(‘crm.stage’, string=’Stage’,
group_expand=’_read_group_stage_ids’)
15. Compute (string) : Field ini valuenya akan ditentukan oleh sebuah method, bukan
dari inputan user. Sebuah field yang menggunakan attribute compute secara default
akan menjadi readonly dan tidak menyimpan valuenya.
amount_tax = fields.Monetary(compute=’_compute_amount’)
16. Inverse (string) : Fungsinya adalah untuk membuat field compute menjadi bisa
diedit oleh user dan secara otomatis mempengaruhi value field lain yang menjadi
depends method computenya. Attribute ini berfungsi hanya pada field yang memiliki
attribute compute.
Contohnya ketika kita membuat field tanggal akhir training yang tercompute otomatis
berdasarkan field tanggal awal training dan durasi harinya.Maka ketika kita mengedit
field tanggal akhir training, maka kita bisa membuat method inverse untuk mengedit
value pada field durasi atau tanggal awal training agar sesuai dengan yang kita input
pada field tanggal akhir training.
qty_delivered = fields.Float(compute=’_compute_qty_delivered’,
inverse=’_inverse_qty_delivered’)
17. Search (string) : Secara default, field compute tidak menyimpan valuenya di
database karna bersifat on the fly. Karna tidak menyimpan valuenya, maka otomatis
valuenya tidak bisa kita jadikan paramater untuk proses seaching. Solusinya adalah
dengan meambah attribute search ini.
Isi dari attribute ini adalah sebuah method yang memberikan domain pada value field.
Domain yang dihasilkan bisa kita gunakan sebagai parameter saat menggunakan
13
method search() dan beberapa fitur pada view seperti search, filter, dan group.
is_subcontractor = fields.Boolean(search=”_search_is_subcontractor”)
18. Related (string) : Berfungsi untuk memberikan value sebuah field berdasarkan
value field lain pada model yang berbeda dengan perantara field many2one.
Defaultnya field ini valuenya tidak disimpan, tidak bisa di copy/duplicate, dan
readonly.
Contohnya ketika kita membuat sebuah field ‘No Visa’ pada model Contract yang
nilainya sama seperti field ‘No Visa’ pada model Employee. Maka ketika membuat
data contract, user tidak perlu lagi mengulang mengisi field ‘No Visa’ pada model
Contract, karna valuenya sudah otomatis terisi dari model Employee selama field
perantara yaitu employee_id nya terisi.
visa_no = fields.Char(related=”employee_id.visa_no”)
19. Size (integer) : Berfungsi untuk membatasi jumlah digit karakter pada field type
Char.
code = fields.Char(size=64)
20. Translate (boolean) : Berfungsi untuk menentukan apakah label dari field bisa di
terjemahkan atau tidak. Nilai defaulnya adalah False.
name = fields.Char(string=’Account Type’, translate=True)
21. Digits (tuple(integer, integer)) : Berfungsi untuk menentukan jumlah digit angka
pada field type Float. Elemen sebelah kiri adalah jumlah totalnya, sedangkan elemen
sebelah kanan jumlah decimalnya.
amount = fields.Float(digits=(16, 4))
14
22. Max Width (integer) : Berfungsi untuk menentukan nilai max lebar pada field
typeImage
image_1920 = fields.Image(max_width=1920, max_height=1920)
23. Max Height (integer) : Berfungsi untuk menentukan nilai max tinggi pada field
type Image
image_1024 = fields.Image(max_width=1024, max_height=1024)
24. Selection (list(tuple(string, string))) : Berfungsi untuk menentukan pilihan value
pada field type Selection
state = fields.Selection(selection=[(‘draft’, ‘Draft’), (‘posted’, ‘Posted’)])
25. Selection Add (list(tuple(string, string))) : Berfungsi untuk menambahkan pilihan
value saat overriding pada field type Selection
state = fields.Selection(selection_add=[(‘open’, ‘Open’)])
26. Comodel Name (string) : Berfungsi untuk menentukan model relasi tujuan pada
field-field relasi seperti many2one, one2many, dan many2many. Biasanya langsung di
tulis valuenya, jarang bersama attributenya kecuali kita menggunakan snippet.
partner_id = fields.Many2one(comodel_name=‘res.partner’, string=’Partner’)
atau
partner_id = fields.Many2one(‘res.partner’, ‘Partner’)
27. Domain (list(tuple(value, value)) : Berfungsi untuk memfilter data yang akan
menjadi kandidat valuenya pada field-field relasi seperti many2one, one2many, dan
many2many
15
product_id = fields.Many2one(‘product.product’, domain=[(‘purchase_ok’, ‘=’,
True)])
28. Context (dictionary) : Attribute ini memiliki banyak fungsi dan bisa kita
definisikan baik di python maupun xml. Diantara fungsinya untuk mengirim
informasi, memberikan value default field, mengontrol tampilan data (filters, groupby,
sorting), memiliki fungsi seperti domain, dll.
company_id = fields.Many2one(‘res.company’, context={‘user_preference’: True})
29. Ondelete (string) : Berfungsi untuk menentukan action apa yang harus dilakukan
ketika record referensi dihapus pada model aslinya. Ada beberapa nilai dari attribute
ini, seperti berikut :
set null: Ketika record model referensi dihapus, maka value field ini akan menjadi
kosong (tanpa value)
restrict: Record model referensi tidak bisa dihapus sebelum record yang mengandung
value field ini dihapus
cascade: Ketika record model referensi dihapus, maka record yang mengandung
value field ini ikut dihapus
order_id = fields.Many2one(‘sale.order’, ondelete=’cascade’)
30. Auto Join (boolean) : Defaultnya bernilai False, jika kita set True maka ORM
akan melakukan proses SQL Joins yang akan mengabaikan security (record rules &
access right) sehingga menjadi lebih efisien dan cepat untuk performancenya. Akan
tetapi user bisa melihat record yang tidak menjadi otoritasnya
partner_id = fields.Many2one(‘res.partner’, auto_join=True)
31. Delegate (boolean) : Atrribute ini fungsinya hampir sama seperti attribute class
inherits. Defaultnya bernilai False, maka ketika kita set True, field-field yang ada di
model relasi ini bisa kita akses pada model kita baik di xml maupun di pythonnya
16
tanpa mendefiniskannya terlebih dahulu.
Contohnya ketika kita membuat model baru dengan nama ‘training.kursus’ dan kita
memiliki hanya 2 field saja yaitu name dan description. Maka ketika kita
menambahkan field partner_id yang bertipe many2one ke ‘res.partner’ dan memiliki
attribute delegate, maka secara otomatis kita bisa menggunakan field-field model
‘res.partner’ pada model ‘training.kursus’ kita baik pada xml maupun pythonnya. Kita
bisa menambahkan field email, phone, street, dll kedalam xml kita tanpa kita perlu
mendefiniskan terlebih dahulu field-field tersebut di file python kita.
partner_id = fields.Many2one(‘res.partner’, ‘Partner’, delegate=True)
32. Inverse Name (string) : Menentukan field relasi pada model yang menjadi target
relasi sebagai jembatan ke model sumber. Biasanya langsung di tulis valuenya, jarang
bersama attributenya kecuali kita menggunakan snippet. Attribute ini hanya
digunakan pada field one2many saja.
order_line = fields.One2many(comodel_name=‘sale.order.line’,
inverse_name=‘order_id’, string=’Order Lines’)
atau
order_line = fields.One2many(‘sale.order.line’, ‘order_id’, ‘Order Lines’)
33. Limit (integer) : Berfungsi untuk membatasi jumlah record yang bisa di
read/tampilkan pada field one2many. Kita bisa menentukannya pada python maupun
xml. Biasanya juga digunakan pada method search() sebagai pembatas jumlah
recordnya yang dihasilkan.
member_ids = fields.One2many(‘hr.employee’, ‘department_id’, ‘Members’,
limit=10)
atau
17
self.env[‘account.move.line’].search([(‘account_id’, ‘in’, self.ids)], limit=1)
E. FIELD METHOD
Method yang jarang digunakan developer adalah method pada field. Padahal secara
default, beberapa field di Odoo memiliki method yang bermanfaat seperti pada field
Float, Date, dll. Jadi sebelum kita menggunakan library python, pastikan kita sudah
memaximalkan penggunaan method pada field ini.
1. Round() : Berfungsi untuk membulatkan bilangan pada field Float
fields.Float.round(self.product_uom_qty,
precision_rounding=self.product_uom_id.rounding)
2. Is Zero() : Berfungsi untuk mengecek apakah bilangan bernilai 0 atau tidak pada
field Float
fields.Float.is_zero(self.product_uom_qty,
precision_rounding=self.product_uom_id.rounding)
3. Compare() : Berfungsi untuk membandingkan 2 bilangan pada field Float
field.Float.compare(self.product_uom_qty, self.qty_done,
precision_rounding=self.product_uom_id.rounding)
4. To Date() : Berfungsi untuk mengconvert string ke object date pada field Date
fields.Date.to_date(self.date_order)
5. To Datetime() : Berfungsi untuk mengconvert string ke object datetime pada field
Datetime
fields.Datetime.to_datetime(values[‘date_start’])
18
6. Add() : Berfungsi untuk menambahkan object date/datetime dengan bilangan detik,
jam, hari, bulan atau tahun
fields.Date.add(fields.Date.today(), months=4))
fields.Datetime.add(fields.Datetime.now(), days=3)
7. Subtract() : Berfungsi untuk mengurangi object date/datetime dengan bilangan
detik, jam, hari, bulan atau tahun
fields.Date.subtract(fields.Date.today(), months=4))
fields.Datetime.subtract(fields.Datetime.now(), days=3)
8. Context Today() : Berfungsi untuk memberikan tanggal hari ini berdasarkan
timezone user pada field Date
fields.Date.context_today(self)
9. End Of() : Berfungsi untuk mendapatkan tanggal akhir dari suatu period baik tahun,
quarter, bulan, pekan, hari atau jam. Harus mengimport code from
odoo.tools.date_utils import *
end_of(fields.Date.today(), ‘week’)
10. Start Of() : Berfungsi untuk mendapatkan tanggal awal dari suatu period baik
tahun, quarter, bulan, pekan, hari atau jam. Harus mengimport code from
odoo.tools.date_utils import *
start_of(fields.Date.today(), ‘month’)
11. To String() : Berfungsi untuk mengconvert object date/datetime ke string
fields.Date.to_string(date.today())
fields.Datetime.to_string(date.today())
19
12. Today() : Berfungsi untuk memberikan tanggal hari ini pada field Date/Datetime
fields.Date.today()
fields.Datetime.today()
13. Now() : Berfungsi untuk memberikan tanggal dan waktu saat ini pada field
Datetime
fields.Datetime.now()
F. AUTOMATIC FIELD
Sesuai dengan judulnya, field-field dibawah ini adalah field yang otomatis akan
tercipta setiap kita membuat model baru walaupun kita tidak mendefinisikannya.
Id : Field yang berfungsi sebagai primary key, akan otomatis auto increment dan
bersifat unik
create_uid : Field yang memberikan informasi user siapa yang membuat record
create_date : Field yang memberikan informasi tanggal berapa record dibuat
write_uid : Field yang memberikan informasi user siapa yang merubah record
terakhir kali
write_date : Field yang memberikan informasi tanggal berapa record dirubah
terakhir kali
G. SPESIAL FIELD
Daftar field dibawah ini merupakan field yang akan digunakan oleh beberapa attribute
atau method dari ORM, jadi disarankan untuk membuatnya pada setiap model baru.
name : Penjelasan lengkapnya pada bagian _rec_name
state : Digunakan untuk proses Stages atau Approval dan dipakai oleh attribute field
States
company_id : Digunakan untuk fitur Multi Company dan attribute field
check_company
20
active : Digunakan oleh button toggle visibility, defaultnya bernilai True, jika di set
False maka record tidak dapat dilihat dan dicari
H. DECORATORS
ORM Odoo menyediakan beberapa decorators yang sangat bermanfaat dan sering kita
gunakan dalam proses development. Untuk penjelasan singkat tentang decorator pada
python bisa cek disini.
@api.constrains() : Method yang memiliki decorator ini berfungsi untuk membuat
constraints (pengecekan batasan/aturan) value sebuah field
@api.constrains('rounding')
def validate_rounding(self):
for record in self:
if record.rounding <= 0:
raise ValidationError(_("Please set a strictly positive rounding
value."))
@api.onchange() : Method yang memiliki decorator ini akan melakukan action
ketika user melakukan perubahan value sebuah field pada form view
@api.onchange('phone', 'country_id', 'company_id')
def _onchange_phone_validation(self):
if self.phone:
self.phone = self.phone_format(self.phone)
@api.depends() : Method yang memiliki decorator ini akan melakukan action ketika
terjadi perubahan value dari field yang memiliki attribute compute. Nama method ini
biasanya menjadi nilai dari attribute computenya
product_qty = fields.Float(compute=’_compute_product_qty’, string=’
21
Product Qty’, digits=’Product Unit of Measure’)
@api.depends('product_id', 'product_uom', 'product_uom_qty')
def _compute_product_qty(self):
for line in self:
if not line.product_id or not line.product_uom or not
line.product_uom_qty:
line.product_qty = 0.0
line.product_qty =
line.product_uom._compute_quantity(line.product_uom_qty,
line.product_id.uom_id)
I. ENVIRONMENTS
Environment menyimpan beberapa informasi yang digunakan oleh ORM seperti
database cursor untuk proses query, user yang aktif untuk proses akses right, dll.
Setiap recordset memiliki sebuah environment yang tidak bisa dirubah dan bisa kita
akses dengan keyword env
user : Mendapatkan informasi user yang aktif
self.env.user
cr : Berfungsi untuk melakukan proses query
self.env.cr.execute(‘SELECT indexname FROM pg_indexes WHERE
indexname = %s’, (index_name))
22
context : Berfungsi untuk mendapatkan parameter
self.env.context.get(‘account_id’)
ref : Mendapatkan record data yang didefiniskan pada file xml (view, groups, reports,
dll) dengan memberikan xml_id nya
self.env.ref(‘base.view_users_form’)
company : Mendapatkan informasi company yang aktif
self.env.company
lang : Mendapatkan informasi code bahasa
self.env.lang
J. ORM METHODS
ORM Odoo juga telah menyediakan method-method pengganti dari query sql yang
sangat powerfull untuk memanipulasi data sebuah model. Kita juga bisa melakukan
overriding terhadap method-method tersebut. Method-method ini juga memiliki
parameter-parameter yang disesuaikan dengan fungsinya.
23
1. Create() : Berfungsi untuk membuat sebuah record baru
self.env[‘res.partner’].create({
‘name’: ‘Muhammad Aziz’,
‘city’: ‘Bekasi’,
’email’: ‘[email protected]’,
})
2. Copy() : Berfungsi untuk menduplicate sebuah record
self.partner_id.copy()
3. Write() : Berfungsi untuk merubah value field dari record
self.partner_id.write({
‘name’: ‘Umar’,
’email’: ‘[email protected]’,
})
4. Flush() : Berfungsi untuk menjalankan proses-proses perhitungan dan update yang
pending pada semua model
self.env[‘res.partner’].flush()
5. Browse() : Berfungsi untuk membuat sebuah recordset dari id record yang
diberikan
self.env[‘res.partner’].browse([1, 2, 3, 4, 5])
6. Search() : Berfungsi untuk melakukan pencarian record berdasarkan value field
self.env[‘res.partner’].search([(‘name’, ‘ilike’, ‘muhammad’), (‘city’, ‘=’, ‘bekasi’)])
7. Unlink() : Berfungsi untuk menghapus record
self.partner_id.unlink()
24
8. Search Count() : Berfungsi untuk melakukan pencarian record berdasarkan value
field dan menghitung total record yang didapat
self.env[‘res.partner’].search_count([(‘name’, ‘ilike’, ‘muhammad’), (‘city’, ‘=’,
‘bekasi’)])
9. Read() : Berfungsi untuk membaca value field dari record
self.partner_id.read()
Jika kita perhatikan, parameter-parameter dari method diatas hanya berlaku untuk
field-field normal yaitu field-field selain relasi. Untuk menggunakan method-method
diatas terhadap field-field relasi seperti one2many dan many2many yang bisa
memiliki kumpulan records (set), maka ada syntax khusus yang akan kita gunakan
sebagai parameternya terutama untuk method create(), write(), dan unlink().
(0, 0, {values}) # Membuat sebuah record baru
(1, id, {values}) # Merubah value field sebuah record
(2, id, 0) # Menghapus sebuah record
(3, id, 0) # Menghapus relasi sebuah record dari set tetapi tidak menghapus recordnya
(4, id, 0) # Menambahkan record baru ke set
(5, 0, 0) # Menghapus relasi semua record dari set tetapi tidak menghapus recordnya
(6, 0, [ids]) # Mengganti semua record yang ada di set dengan record yang baru
K. RECORDSETS OPERATIONS
Recordset yang sangat powerfull ini selain berfungsi untuk menampung data sebagai
object, recorset juga memiliki beberapa operations yang bisa kita gunakan agar lebih
maksimal dalam proses development.
filtered() : Berfungsi untuk memfilter recordset berdasarkan parameter yang
diberikan
value = data_sales.filtered(‘partner_id.is_company’)
print(value) #> sale.order(1, 4, 13, 20)
25
mapped() : Berfungsi untuk membuat list value dari pemetaan recordset
value = data_partner.mapped(‘name’)
print(value) #> [‘Umar’, ‘Utsman’, ‘Ali’, ‘Hamzah’]
sorted() : Berfungsi untuk mengurutkan recordset berdasarkan parameter yang
diberikan
value = data_partner.sorted(‘name’)
print(value) #> sale.order(20, 4, 1, 13)
L. WIDGET
Odoo memiliki banyak widget untuk menambah variasi kegunaan sebuah field pada
tampilan user (GUI). Hal ini banyak membantu developer dan sangat berguna dalam
mempercepat dan mempermudah proses development.
1. Basic Fields
abstract
input
integer
boolean
date
datetime
daterange
remaining_days
domain
text
html
float
char
link_button
handle
email
phone
26
url
CopyClipboardText
CopyClipboardChar
image
image_url
binary
pdf_viewer
monetary
percentage
priority
attachment_image
label_selection
state_selection
boolean_favorite
boolean_toggle
statinfo
percentpie
float_time
float_factor
float_toggle
progressbar
toggle_button
dashboard_graph
ace
color
many2one_reference
color_picker
2. Relational Fields
selection
radio
selection_badge
many2one
many2one_barcode
27
many2one_avatar
many2many
many2many_binary
many2many_tags
many2many_tags_avatar
many2many_checkboxes
one2many
statusbar
reference
font
3. Special Fields
timezone_mismatch
report_layout
iframe_wrapper
Untuk lebih lengkapnya, daftar widget bisa cek disini beserta tampilannya :
Source Odoo : addons/web/static/src/js/fields/field_registry.js
https://www.candidroot.com/blog/our-candidroot-blog-1/post/widgets-in-odoo-14-72
https://www.odoo.com/documentation/14.0/developer/reference/javascript_reference.
html#field-widgets
Terakhir, sedikit peraturan dalam penulisan coding agar rapih dan nyaman bagi
developer lainnya.
Alhamdulillah akhirnya penulis bisa menyelesaikan tutorial tahap pertama ini.
28
InsyaAllah kita akan lanjutkan serial tutorial technical ini sampai membuat aplikasi
training seperti sebelumnya.
Penulis sadar tulisan ini sangat jauh dari sempurna, olehkarna itu penulis
mengharapkan koreksi, saran dan kiritk yang membangun.
Semoga bermnafaat. Wassalam …
Sumber :
https://www.odoo.com/documentation/14.0/developer/reference/orm.html
https://www.odoo.com/documentation/14.0/developer/reference/guidelines.html
29