File loading please wait...
Citation preview
Training Odoo Technical
Training Odoo Technical 1. Pengenalan Odoo dan sejarahnya a)
Mengenal tentang Odoo Odoo adalah sebuah all-in-one management software (sepaket perangkat lunak manajemen) yang menawarkan perangkat terintegrasi untuk manajemen perusahaan seperti CRM, Website, e-Commerce, Accounting, Sales, Purchase, Inventory, Manufacture, dan lain sebagainya. Di dunia bisnis sendiri Odoo lebih dikenal sebagai software ERP dikarenakan awal mulanya yang ditujukan untuk keperluan tersebut. Seiring berjalannya waktu, sudah banyak aplikasi sistem informasi manajemen yang menggunakan Odoo sebagai framework untuk sistemnya. Semua itu dikarenakan Odoo bersifat Open Source dan dapat mencakup berbagai proses bisnis dengan mudah dan rapi. Antarmuka Odoo bersifat single page web app sehingga aplikasinya diakses melalui web browser baik di komputer pribadi, laptop, tablet, hingga ponsel yang menjadikannya dapat diakses lebih mudah. Odoo bersifat multiplatform, software-nya dapat di-install pada berbagai OS saat ini, baik itu Linux, Windows, atau Mac. Namun Odoo sendiri dikembangkan menggunakan Ubuntu, yang juga menjadi rekomendasi ketika ingin men-deploy Odoo atau melakukan development modul Odoo. Beberapa kelebihannya yang lain adalah: modular, data-driven, internationalization.
b)
Sejarah Odoo Berawal pada 2005, Fabien Pinckaers sebagai pendiri dan CEO Odoo saat ini memulai sebuah development untuk software ERP yang bernama TinyERP. Pada tahun 2008 kata tiny yang berarti kecil di dalam produknya membuat dia berpikir untuk mengganti namanya untuk menambah kepercayaan penggunanya. Namanya kemudian diubah menjadi OpenERP. Perubahan model bisnis dilakukan OpenERP dari membangun software hingga menyediakan layanan ke pengguna menjadi fokus pada pengembangan software saja, sementara model bisnis yang baru adalah partnership dan maintenance. Model bisnis tersebut terbukti sukses. Perkembangan OpenERP yang begitu pesat mencapai 1549% dalam waktu 5 tahun menjadikannya sebagai perusahaan yang paling cepat tumbuh di Belgia. Pada 2013 berdiri sebuah komunitas Odoo yang paling aktif dan banyak berkontribusi
Erlangga Indra Permana
PT Arkana Solusi Digital
Training Odoo Technical
yaitu Odoo Community Association (OCA). Seiring perkembangan modul-modul di dalam OpenERP yang membuatnya tidak lagi hanya terpaku dengan ERP, namun juga melebar ke Website, POS, E-commerce dan lainnya membuat perusahaan mengubah nama OpenERP pada 2014 menjadi Odoo untuk mengembangkan produk ke arah manapun. Saat ini Odoo mempunyai 370 karyawan, 950 partner, dan 3 juta lebih pengguna.
Erlangga Indra Permana
PT Arkana Solusi Digital
Training Odoo Technical
2. Posisi Odoo di pasar bisnis a)
Penempatan di dalam pasar Di dalam dunia enterprise Odoo lebih dikenal sebagai software ERP. Pada websitenya Odoo menjelaskan “Kami pikir perangkat software bisnis harus memenuhi keperluan yang kompleks tanpa menjadi rumit. Misi kami adalah menyediakan software yang intuitif, penuh fitur, terintagrasi penuh, mudah di-upgrade, saat semuanya berjalan dengan lancar untuk setiap bisnis, setiap user.”
Odoo digadang-gadang mampu memenuhi keperluan bisnis dari skala kecil hingga menengah, dari 1 pengguna hingga ratusan ribuan pengguna. Hal ini dirasakan oleh komunitas Odoo karena fleksibilitas Odoo dan pengintegrasian antar aplikasi dalam satu platform dapat dilakukan secara tanpa menggangu data yang sudah ada dan dirasakan lebih mudah dalam sisi manajemen.
b)
Penyebaran Odoo Saat ini Odoo mempunyai 950 partner dari berbagai macam negara. Sementara ini di Indonesia sendiri mempunyai 19 partner.
c)
Komunitas dan Enterprise
Erlangga Indra Permana
PT Arkana Solusi Digital
Training Odoo Technical
Odoo pada awalnya dikembangkan bersama komunitas di bawah lisensi GPL dan AGPL membuat Odoo berkembang dengan cukup pesat. Dimulai pada versi 6.0 Odoo menggunakan web sebagai platform antarmuka software-nya yang kemudian menyudahi versi GTK.
Sejak kemunculan Odoo versi 9 lisensi yang digunakan Odoo S.A. untuk software-nya menggunakan 3 lisensi, yaitu LGPL versi 3, Odoo Enterprise Edition License v1.0 dan Odoo Proprietary License v1.0. Bersamaan dengan terpecahnya versi Odoo menjadi 2 versi, Odoo Community dan Odoo Enterprise. Pada dasarnya Odoo Enterprise adalah Odoo Community dengan modul tambahan khusus enterprise yang menjadikan perbedaan keduanya adalah pada fitur dan tampilannya. Pada versi enterprise fitur pada beberapa aplikasi mempunyai tambahan dari modul enterprise. Untuk menggunakan modul enterprise sendiri harus mendapatkannya lewat partner Odoo atau menggunakan Odoo Cloud Platform.
Erlangga Indra Permana
PT Arkana Solusi Digital
Training Odoo Technical
3. Odoo Secara Teknikal Odoo secara garis besar mempunyai backend yang didasari dengan Python & PostgreSQL, sementara di bagian frontend (UI/UX) menggunakan JS dengan beberapa framework JS dan CSS dengan beberapa framework CSS. Arsitektur yang Odoo gunakan bersifat three-tier architectures. Singkatnya terdapat 3 layer terpisah pada aplikasi, yaitu:
a)
Client layer Client layer adalah layer yang diakses pada sisi user, bisa dikatakan sebagai presentation layer. Layer ini adalah layer antarmuka (user interface) kepada user.
b)
Business layer Business layer adalah layer yang berguna sebagai penengah antara data layer dan client layer. Layer ini disebut juga intermediary layer. Layer ini menjalankan business logic yang dideklarasikan seperti validasi data, perhitungan, dan memasukkan data ke database.
c)
Data layer Data layer atau disebut juga Data access layer digunakan untuk menyimpan data.
Secara teknikal berikut adalah teknologi yang digunakan pada Odoo:
Erlangga Indra Permana
PT Arkana Solusi Digital
Training Odoo Technical
a)
Python Python adalah sebuah bahasa pemrograman yang bersifat terbuka. Odoo menggunakan bahasa pemrograman Python sebagai business logic dan business object pada aplikasinya. Selain itu secara khusus file Python juga digunakan sebagai manifest untuk mengetahui informasi modul. Untuk Odoo dibawah versi 11 menggunakan Python versi 2.7, sedangkan versi 11 dan yang terbaru menggunakan Python versi 3. Sebuah kebiasaan yang baik apabila di baris pertama file python yang kita buat dimulai dengan berikut: # -*- coding: utf-8 -*-
Gunanya adalah menandakan skrip pada file menggunakan unicode UTF-8, sehingga menghindari error ketika menggunakan karakter yang tidak ada pada ANSI.
b)
PostgreSQL Odoo menggunakan PostgreSQL sebagai database untuk datanya. Versi yang digunakan adalah versi 9.6. Pada Odoo, developer tidak membuat, menginisialisasi database untuk digunakan Odoo, akan tetapi menggunakan platform Odoo untuk membuat database dan Odoo akan otomatis membuat tabel yang akan digunakan. Begitu juga melakukan pembuatan field atau mengubah field dilakukan melalui file Python. Membuat database Odoo dapat dilakukan langsung dengan cara membuka Odoo dan klik tombol Create Database pada database manager. Secara otomatis modul yang ada pada addons path (folder untuk menyimpan modul) dapat dilihat di menu Apps.
Erlangga Indra Permana
PT Arkana Solusi Digital
Training Odoo Technical
Secara konvensi, email dan password Odoo secara default untuk development adalah admin yang sekaligus akan menjadi superuser pada user Odoo. Language diisi dengan English sebagai default. Country diisi sesuai negara kita tinggal. Ketika “Load demonstration data” dicentang maka akan memuat data demo pada modul sebagai data dummy untuk mengetes fungsional modul. c)
Markup Language (XML) Bahasa markup atau Markup languange digunakan sebagai penanda pada suatu data, yang paling umum kita temui adalah HTML saat kita berselancar pada dunia maya. Apa yang kita lihat di browser saat kita berselancar sebenarnya adalah data pada markup yang di-parsing pada browser sehingga menghasilkan sebuah tampilan. Bahasa markup juga biasanya memiliki struktur hierarki seperti pohon, yang artinya sebuah tag harus mempunyai struktur yang berurutan. Tidak jauh berbeda pada browser yang mengubah HTML menjadi sebuah tampilan, pada Odoo ekstensi file berupa XML digunakan untuk mendeklarasikan data yang berisi menu, action, tampilan, atau pun data untuk suatu model. Data berupa menu, action, dan tampilan akan diubah menjadi menu dan tampilan yang akan menjadi tempat bagi data-data untuk ditampilkan.
pembuka
pembuka
deklarasi record {nilai}nilai field-nya Erlangga Indra Permana
PT Arkana Solusi Digital
Training Odoo Technical
Di atas adalah contoh dari struktur isi file xml untuk Odoo. Sebuah bahasa markup mempunyai elemen (tag) dan di dalam tag dapat berisi atribut. Seperti contoh tag record mempunyai atribut model dan id, sedangkan tag memiliki atribut name. Sebuah id pada record dalam satu modul tidak boleh sama. Hal ini akan berpengaruh saat external identifier (id ekternal) suatu modul diacu. Format id ekternal adalah nama_modul.id_record. Ketika sebuah modul di-upgrade, data pada XML dimuat ulang yang membuat data akan berubah. Kita dapat mencegah hal tersebut dengan menambahkan atribut noupdate yang bernilai True pada elemen data menjadi seperti berikut:
d)
CSV CSV adalah File CSV pada Odoo mirip kegunaan XML untuk memasukkan data. Sedikit berbeda pada CSV jika pada XML kita dapat memasukkan data ke dalam model dengan mengisi nilai atribut model pada tag record, pada CSV kita hanya dapat menyimpan data untuk satu model untuk satu file CSV. Contohnya ketika ingin menyimpan data dengan file csv pada model ir.model.access maka kita harus membuat file ir.model.access.csv dan berisi kolom (field) serta nilai dari setiap barisnya untuk field tersebut.
e)
Framework Framework secara bahasa berarti kerangka kerja. Secara istilah pemrograman framework adalah suatu kumpulan library atau paket program yang mempunyai fungsi-fungsi dan aturan-aturan yang berguna untuk mempercepat pembuatan suatu program aplikasi. Framework dalam dunia nyata mirip seperti cetakan kue. Ketika kita ingin membuat kue dengan bentuk bintang maka adonan akan
Erlangga Indra Permana
PT Arkana Solusi Digital
Training Odoo Technical
mengikuti cetakan tersebut. Namun kita pun dapat menambahkan hiasan pada kue kita sesuai selera, seperti tambahan kacang, coklat, karamel, dan lain-lain. Tatkala kita sudah mulai melakukan pemrograman dengan framework maka kita pun harus mengikuti aturan atau tata cara yang diatur dari sebuah framework. Begitu juga Odoo, ketika kita menggunakan framework Odoo kita pun harus berpikir untuk menyesuaikan diri dengan aturan-aturan pada Odoo yang sudah dibuat. Jika kita mengetahui framework berjenis MVC (Model, View, Controller), tugas Python disini adalah berkomunikasi dengan database sebagai jembatan dan controller dari interaksi di antarmuka, sedangkan XML berguna sebagai view yang akan dibuat dari data di XML menjadi sebuah tampilan HTML yang menempatkan data data. Inilah maksud dari MVC: ●
Model, mendefinisikan struktur data
●
View, mendefinisikan tampilan
●
Controller, mengatur business logic dari aplikasi
Menggunakan framework Odoo kurang lebih hanya mengikuti template yang sudah dibuat Odoo.
Erlangga Indra Permana
PT Arkana Solusi Digital
Training Odoo Technical
2. Struktur Modul File Odoo a)
Penginisialisasian file Python Business logic dan business object disimpan di dalam file Python yang akan diolah secara server-side. Agar dapat digunakan, sebuah file Python harus diinisialisasikan terlebih dahulu melalui file __init__.py. Contoh isi dari __init__.py adalah sebagai berikut: import models import report import wizard import belajar_odoo.py
b)
Mengenal manifest dan kegunaannya Setiap modul Odoo harus memiliki satu manifest. Manifest adalah file yang berguna untuk mengetahui informasi dari modul. Seperti nama, deskripsi, keterkaitan dengan modul lain, file yang digunakan, dan lain-lain. Manifest menggunakan file Python yang berisi satu dictionary tanpa perlu dideklarasikan dalam variabel dan dibuat dengan nama file __manifest__.py.
Ini adalah format dari isi __manifest__.py
# -*- coding: utf-8 -*{ 'name' : 'Contoh Manifest', 'version' : '1.0', 'summary': 'Contoh manifest training', 'sequence': 10, 'description': """ Deskripsi modul ==================== Deskripsi panjang dari suatu modul dapat ditaruh disini
Erlangga Indra Permana
PT Arkana Solusi Digital
Training Odoo Technical
""", 'category': 'Sales', 'author': 'Erlangga', 'website': 'https://erlaangga.github.io', 'depends' : ['base'], 'data': [ 'security/contoh_security.xml', 'security/ir.model.access.csv', 'data/contoh_data.xml', 'wizard/account_reconcile_view.xml', 'report/contoh_report.xml', 'views/contoh_view.xml', ], 'demo': [ 'demo/contoh_data_demo.xml', ], 'installable': True, 'application': True, }
Script di atas mempunyai isi sebuah dictionary. Berikut adalah tabel key dan value pada isi dictionary tersebut yang biasanya akan digunakan pada saat membuat modul:
No.
Key
Value
Keterangan
1
name
string
Nama modul. Default: kosong
2
version
string
Versi modul
3
author
string
Nama pembuat modul. Dapat instansi atau pribadi. Default: Odoo
Erlangga Indra Permana
PT Arkana Solusi Digital
Training Odoo Technical
S.A. 4
website
string
Berisi URL web. Default: https://www.odoo.co m
5
summary
string
Berisi uraian singkat tentang modul. Default: kosong
6
description
string
Berisi uraian panjang tentang modul. Default: kosong
7
category
string
Kategori modul. Default: uncategorized
8
depends
list
Keterkaitan modul ke modul yang lain. Saat modul yang lain di-depends, saat menginstall modul maka modul lain akan ikut ter-install apabila belum terinstall. Kegunaannya untuk meng-inherit suatu modul. Value berisi list yang berisi string dari nama teknikal modul. Contoh: [‘purchase’,’sale’,’accou nt’]. Default: []
9
data
list
Berisi pendeklarasian file CSV atau XML yang digunakan. Contoh: ['security/ir.model.a ccess.csv','views/pro duct_view.xml']. Default: []
10
demo
list
Digunakan untuk membuat data dummy saat pilihan Load demonstration data
Erlangga Indra Permana
PT Arkana Solusi Digital
Training Odoo Technical
dicentang membuat Default: []
ketika database.
11
installable
boolean
Ketika nilainya False akan membuat modul tidak bisa di-install. Default: True
12
application
boolean
Ketika nilainya True modul akan dianggap sebagai aplikasi, bukan modul biasa. Default: False
Informasi yang akan ditampilkan pada modul sesuai manifest. Ini adalah contoh di pagian kanban Apps.
Kita dapat meng-install modul dengan mengklik tombol Install pada tampilan modul.
Erlangga Indra Permana
PT Arkana Solusi Digital
Training Odoo Technical
Tampilan form untuk data modul akan muncul ketika kanban di-klik.
Tampilan formulir menampilkan informasi tentang modul. Kita dapat mengetahui informasi secara teknikal dengan mengaktifkan Developer Mode. Aktifkan Developer Mode dengan cara klik menu Settings dan klik Activate Developer Mode.
Erlangga Indra Permana
PT Arkana Solusi Digital
Training Odoo Technical
Ketika deveveloper mode aktif kita dapat dapat melihat perbedaan di URL terdapat query debug setelah web. Seperti berikut: http://localhost:8069/web?debug
Erlangga Indra Permana
PT Arkana Solusi Digital
Training Odoo Technical
3. Struktur ORM Odoo: (Modul) model dan field Odoo menggunakan konsep Object Relational Model (ORM) untuk berkomunikasi antara database dan model suatu entitas. Dengan cara ORM yang Odoo buat pun transaksi yang terjadi dengan database tidak akan langsung berhubungan langsung dengan database ketika kita melakukan pemrograman di Python, melainkan dilakukan melalui fungsi-fungsi yang dibuat Odoo. a)
Objek model dan database Model didefinisikan dengan membuat sebuah kelas yang menjadi turunan kelas template Odoo (models.Model). Secara otomatis tabel dan field untuk model di dalam database akan mengikuti nama model dan field yang dideklarasikan pada kelas tersebut. Beberapa variabel yang digunakan dalam model: Nama
Tipe data
Keterangan
_name
String
Mendeklarasikan nama model
_rec_name
string
Menentukan field yang menjadi nama record
_order
string
Menentukan pengurutan record ketika ditampilkan
_sql_constraint
list
Membuat constraint pada table di database
Nama tabel akan menggunakan nama model dengan cara mengubah titik (.) pada nama model menjadi underscore (_). Contohnya, model sale.order tabelnya di database adalah sale_order. Model dapat diakses dari model lain dengan env.
Erlangga Indra Permana
PT Arkana Solusi Digital
Training Odoo Technical
self.env['nama.model']
1.
b)
Field dan jenisnya Karena Odoo menggunakan ORM, field untuk Odoo dapat dideklarasikan secara langsung di dalam model dan field akan secara otomatis dibuat ke dalam tabel milik model di postgres. Kita dapat mendeklarasikan field dengan cara berikut: ● ●
Selain models import juga fields dari library odoo. Deklarasikan variabel fields.NamaMethod.
yang
akan
dijadikan
field
berisi
Jenis field dapat kita lihat di dalam tabel berikut: Python (Nama method)
Postgres (Tipe Data)
Integer
int
Float
double precision
Char
character varying
Text
text
Many2one
relasi
One2many
relasi dari tabel
Many2many
relasi
Selection
character varying
Boolean
Boolean
Date
date without timezone
Datetime
timestamp without timezone
Html
text
Monetary
numeric
Parameter yang umumnya ada di setiap method untuk field: Parameter string
Erlangga Indra Permana
Tipe data Argumen
string
Keterangan Memberi label untuk field
Default Mengikuti nama field
PT Arkana Solusi Digital
Training Odoo Technical
default
mengikuti tipe data field
Membuat nilai awal suatu field saat record dibuat
compute
string
Berisi nama fungsi di model yang di-trigger berdasarkan perubahan nilai field
inverse
string
Berisi nama fungsi di model. Sebagai respon ketika nilai field acuan pada compute diubah
store
boolean
Menyimpan nilai setelah compute ketika bernilai True
True. False saat ada compute
readonly
boolean
Membuat field pada tampilan hanya bisa dibaca
False. True saat ada compute
required
boolean
Membuat constraint not null di database sehingga field tidak boleh kosong pada record
False
help
string
Membuat kalimat keterangan ketika field pada tampilan di-hover
translate
boolean
Mengizinkan field diterjemahkan ke bahasa lain
True
company_depe ndant
boolean
Mengubah field menjadi bagian ir.property sebagai pengaturan untuk satu perusahaan
False
search
string
Berisi nama fungsi di model.
states
string
Berisi nilai untuk
Erlangga Indra Permana
PT Arkana Solusi Digital
Training Odoo Technical
menentukan atribut berdasarkan kondisi nilai field state.
Selain itu ada beberapa field yang otomatis ada ketika sebuah model dibuat: Nama Field
Tipe Data
Keterangan
Default
create_date
timestamp without timezone
Waktu pembuatan record
Waktu pembuatan record
create_uid
integer
id dari user pembuat record
id dari user
write_date
timestamp without timezone
Waktu terakhir pengeditan record
Waktu pembuatan record
write_uid
integer
id dari user pengedit record
id dari user
id
integer
Berisi primary key untuk record
Nilai otomatis menaik untuk setiap record baru
Kita dapat melihat data model pada menu Settings→Technical→Database Structures→Models. Kita dapat melihat perihal informasi tentang struktur database di modul mulai dari model, field, constraint, hingga relasi pada menu Database Structures.
Erlangga Indra Permana
PT Arkana Solusi Digital
Training Odoo Technical
4. Membuat Modul Sebuah modul Odoo adalah sebuah folder di dalam folder addons yang berisi minimal 2 file, yaitu __init__.py dan __manifest__.py. Sebuah module sendiri mempunyai daftar semacam registry di dalam Odoo yang dicatat di database dengan nama model ir.module.module.
Sebuah folder sudah dapat dideteksi sebagai modul oleh Odoo meskipun belum berisi apapun. Isi __manifest__.py dengan berikut 1.
# -*- coding: utf-8 -*-
2.
{
3.
'name' : 'Belajar Odoo', 'version':'1.0', 'summary':'Latihan membuat modul', 'description': """ Modul Belajar Odoo ================== Ini adalah sebuah modul yang digunakan untuk latihan membuat sebuah modul """, 'author':'Erlangga', 'website':'https://erlaangga.github.io', 'depends':['base'], 'data':[], }
4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15.
Sebelum melakukan development, pastikan kita berada pada Developer Mode dan menggunakan superuser untuk memudahkan kita dalam development. a)
Pembuatan model Dalam membuat sebuah model langkahnya adalah sebagai berikut: ●
Buatlah sebuah file python dan inisialisasikan dengan mengimportnya pada __init__.py. Sebagai contoh kita akan menamakan file-nya dengan nama belajar sehingga isi __init__.py sekarang akan seperti ini: import belajar
Erlangga Indra Permana
PT Arkana Solusi Digital
Training Odoo Technical
Import models dari odoo. Seperti yang sudah disinggung sebelumnya, termasuk kebiasaan yang baik jika kita memulai baris pertama dengan komentar berikut:
●
# -*- coding: utf-8 -* from odoo import models
Buat sebuah kelas dan turunkan models.Model. Sebagai contoh kita akan menamakan kelasnya dengan Penumpang.
●
Deklarasikan _name dan isi dengan nama model yang akan kita buat. Sebagai contoh kita akan menamakannya dengan nilai belajar.belajar.
●
Isi skrip belajar.py sekarang akan menjadi seperti berikut: 1.
# -*- coding: utf-8 -*
2.
from odoo import models
3.
class Penumpang(models.Model):
4.
_name = "penumpang.transportasi"
Unt
b)
Pembuatan field Kita akan menambahkan 5 field pada model penumpang.transportasi yang sudah kita buat sebagai berikut: Nama Field
Tipe
name
Char
born_date
Date
state
Selection
weight
Float
height
Float
id_number
Char
Skrip di dalam file belajar.py sekarang akan menjadi seperti berikut:
Erlangga Indra Permana
PT Arkana Solusi Digital
Training Odoo Technical
1.
# -*- coding: utf-8 -*
2.
from odoo import models, fields
3. 4. 5.
class Penumpang(models.Model): _name = "penumpang.transportasi"
6.
c)
7.
name = fields.Char("Name",size=32, help="Passenger's name")
8.
born_date = fields.Date('Born Date')
9.
weight = fields.Float("Weight")
10.
height = fields.Float("Height")
11.
state = fields.Selection([('general','General'),('member',
12.
'Member')], 'State', default="general") id_number = fields.Char("ID Number", size=32, required=1)
Pembuatan tree view dan form view Sebuah tampilan akan menjadi template atau wadah bagi data yang akan ditampilkan. Ada beberapa jenis tampilan atau kita sebut view yang terdapat di dalam Odoo, diantaranya: Kanban, Tree, Form, Calendar, Graph, serta Gantt yang secara ekslusif ada di versi Entreprise. Namun saat ini kita hanya akan membahas tentang tree dan form karena pembuatan view relatif sama, hanya berbeda beberapa hal, dan pembuatan tampilan tree dan form adalah view yang paling mudah dibuat. Kita dapat membuat sebuah view dengan cara membuat file XML di dalam modul dan daftarkan pada manifest. Kita akan membuat sebuah file dengan nama transportasi_view.xml.
'data':['transportasi_view.xml'],
Isi file XML untuk Odoo harus dimulai dengan elemen dan . Kita dapat membuat view dengan menambahkan record ke dalam model ir.ui.view di dalamnya. Struktur XML untuk ir.ui.view relatif sama, yang berbeda hanyalah pada elemen untuk membedakan jenis view yang dideklarasikan.
Erlangga Indra Permana
PT Arkana Solusi Digital
Training Odoo Technical
1.
2.
Nama Tampilan
3.
nama.model
4.
.....isi view.....
5. 6. 7.
Kita buat tampilan untuk model penumpang.transportasi. Ini untuk membuat sebuah tampilan tree: 1.
2.
Penumpang Form
3.
penumpang.transportasi
4.
5. 6.
7.
8.
9. 10.
11.
Erlangga Indra Permana
PT Arkana Solusi Digital
Training Odoo Technical
Ini untuk membuat tampilan form: 1.
2.
Penumpang Form
3.
penumpang.transportasi
4.
5.
6.
7.
9.
10.
11. 12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22. 23.
24.
Dapat kita lihat perbedaan yang ada hanya di dalam elemen field yang mengandung isi name sama dengan arch. Elemen
Nama View
tree
Tree/List
form
Form
kanban
Kanban
graph
Graph
calendar
Calendar
pivot
Tabel Pivot
Erlangga Indra Permana
PT Arkana Solusi Digital
Training Odoo Technical
Untuk membuat view lain, kita dapat menggunakan elemen lain di dalam arch. Model ir.ui.view mempunyai beberapa field: Field
Isi
Keterangan
name
Nama view
Tidak boleh kosong
model
Nama model
Tidak boleh kosong
arch
Isi view
Tidak boleh kosong
inherit_id
Nilai id yang diturunkan
Digunakan saat inherit sebuah view
Pada tampilan form kita dapat menyisipkan elemen HTML untuk memodifikasi tampilan. Berikut adalah atribut pada elemen field d)
Pembuatan action Sebuah tampilan dapat kita lihat dengan memilih menu yang akan menampilkan tampilan. Menu harus memiliki action untuk menampilkan tampilan. Action menentukan jenis tampilan apa yang akan dilakukan. Ada dua cara mendeklarasikan sebuah action. 1. Menggunakan elemen act_window. 1.
2. Mendeklarasikan record ke model ir.actions.act_window seperti cara umumnya.
Erlangga Indra Permana
PT Arkana Solusi Digital
Training Odoo Technical
1.
2.
Nama
3.
ir.actions.act_window
4.
nama_model
5.
form
6.
kanban,tree,form,pivot,graph
7.
8.
9.
[]
10.
{}
11.
12.
13.
Klik untuk membuat data.
14.
15.
Deskripsi panjang.
16.
17.
18.
Keduanya menghasilkan action yang sama. Perbedaan keduanya adalah elemen tidak bisa digunakan untuk menggunakan id view secara spesifik menggunakan atribut view_id serta view yang mempunyai help. Jika kita perhatikan atribut pada menjadi nilai dari atribut name ketika dideklarasikan secara biasa menggunakan . Untuk action yang tidak memerlukan help atau tidak menggunakan view yang spesifik, lebih sederhana untuk dideklarasikan. Ini adalah skrip action yang akan kita gunakan untuk model penumpang.transportasi: 1.
2.
Passengers
3.
penumpang.transportasi
4.
tree,form
5.
6.
7.
Click to create a passenger.
8.
9.
Passengers are easily managed.
10.
11.
12.
Erlangga Indra Permana
PT Arkana Solusi Digital
Training Odoo Technical
Skrip di atas mempunyai fungsi yang sama dengan skrip di bawah ini: 1.
Nama
e)
Keterangan
name
Mendeklarasikan nama action (akan otomatis menjadi subtitle di browser).
res_model
Nama model yang mempunyai
view_type
Tipe view
view_mode
Jenis view yang akan ditampilkan
view_id
Nilai id record dari view yang ingin ditampilkan pada action berdasarkan view_type.
domain
Menyaring record ditampilkan.
context
Menambahkan context.
help
Membuat tampilan deskripsi pada view ketika tidak ada data.
yang
akan
Pembuatan menu Menu adalah jalur utama untuk mengakses fungsional modul. Sebuah menu menandakan keberadaan sebuah modul. Untuk membuat sebuah menu kita harus mendeklarasikannya di dalam XML. Ini adalah skrip pendeklarasian menu: 1.
Kita menggunakan elemen untuk mendeklarasikan sebuah menu. Sebuah menu yang akan tampil di menu bar sebagai menu utama tidak memiliki parent. Namun sebuah submenu dari menu ditandai dengan parent yang membuat menu menjadi anakan dari menu. Untuk menampilkan tampilan menu harus mempunyai action. Secara default, menu akan diurutkan berdasarkan abjad, Erlangga Indra Permana
PT Arkana Solusi Digital
Training Odoo Technical
kecuali kita mendeklarasikan sequence untuk menu tersebut. Berikut adalah atribut pada : Nama
Keterangan
id
Nilai id dari menu.
name
Nama menu.
parent
Atasan menu.
action
Nilai id dari dijalankan.
sequence
Urutan dari menu.
action
yang
akan
Kita buat menu untuk Passenger: 1.
2. 3.
4. 5.
Sebuah kebiasaan di Odoo yaitu menu yang mempunyai action biasanya mempunyai parent meskipun memang tidak harus. Kita dapat melihat modul yang kita buat pada menu Apps dan cari modul kita dengan mencarinya.
Erlangga Indra Permana
PT Arkana Solusi Digital
Training Odoo Technical
Setelah di-install belajar_odoo.
kita
akan
melihat
menu
dan
tampilan
dari
modul
Kita dapat mengisi data dengan mengklik tombol Create.
Sejauh ini kita sudah berhasil membuat sebuah modul dengan fungsi untuk mencatat penumpang. Kita dapat menambahkan atribut required pada elemen . Perbedaan dengan menambahkannya pada saat pendeklarasian field adalah, atribut di XML tidak mengubah constraint di database atau hanya sekedar properti saja. Pada tampilan, kita dapat melihat atribut required pada XML dan required pada argumen field menghasilkan tampilan field yang sama-sama required pada tampilan yang ditandai dengan warna biru.
Erlangga Indra Permana
PT Arkana Solusi Digital
Training Odoo Technical
5. Relasi Di dalam relational database kita mengenal relasi-relasi antar tabel yang mempermudah pendataan. Di dalam konsep database relasional kita mengenal beberapa jenis relasi, diantaranya: One to One, Many to One, One to Many, dan Many to Many. Namun di Odoo kita hanya menemukan 3 jenis relasi tersebut. Relasi one to one tidak ada, sebagai gantinya kita dapat menggunakan many to one yang ditemani constraint untuk membuat relasinya unik. a)
Many to One Relasi many to one (banyak ke satu) adalah relasi yang antara 2 tabel, dimana field dari tabel A dapat mempunyai referensi atau foreign key dari primary key tabel B. Contohnya adalah hubungan antara pasien dan ruangan. Satu data pasien hanya dapat terhubung dengan satu ruangan.
Di dalam database sebuah field yang digunakan untuk menyimpan reference harus mempunyai tipe data yang sama dengan field primary key yang menjadi acuannya di tabel lain. Namun di dalam Odoo, sebuah primary key adalah field id yang mempunyai tipe data integer. Ketika kita membuat field many to one secara otomatis mengarah ke field id. Ini adalah cara mendeklarasikan field many to one: 1.
namafield_id = fields.Many2one("nama.model","String Field")
Secara konvesional kita nama b)
One to Many Jika kita perhatikan relasi one to many (satu ke banyak) adalah kebalikan dari many to one, yaitu satu entiti dapat mempunyai hubungan dengan beberapa record entiti lain.
Erlangga Indra Permana
PT Arkana Solusi Digital
Training Odoo Technical
Ini adalah cara mendeklarasikan field many to one: 1.
namafield_ids = fields.One2many("nama.model", "field_many2one",
"String Field")
Kebiasaannya sebuah field one to many mempunyai postfix _ids atau _line setelah namanya agar memudahkan saat mengidentifikasi jenis field relasi saat development atau debugging. Sebuah relasi one to many memiliki relasi kepada record entiti lain yang mengacu primary key-nya. c)
Many to Many Relasi many to many (banyak ke banyak) mempunyai relasi yang menghubungkan beberapa record ke beberapa record. Relasi seperti one to many dan many to many biasanya menyimpan relasi ini di table relasi yang ditandai dengan postfix _rel setelah nama tabelnya. Ini adalah cara mendeklarasikan field many to many: 1.
namafield_ids = fields.Many2many("nama.model", string="String
Field")
Kebiasaannya sebuah field many to many mempunyai postfix _ids atau _line seperti one to many. Kita akan mencoba menambahkan model baru bernama transportasi.bus dan jadwal.bus. Berikut adalah atribut untuk ditambahkan ke transportasi.bus:
Erlangga Indra Permana
PT Arkana Solusi Digital
Training Odoo Technical
1.
name = fields.Char("Name",size=24, help="Bus' name")
2.
code = fields.Char("Code",size=12, help="Bus' code", required=True)
3.
capacity = fields.Integer("Capacity", help="Seat or accomodation
4. 5.
6.
capability") image = fields.Binary("Image") state = fields.Selection([('draft','Draft'),('ok','OK'),('maintenance','Maint enance'),('deprecated','Deprecated')], "State", default="draft") schedule_line = fields.One2many("jadwal.bus", "bus_id", "Schedule")
Tambahkan atribut berikut pada jadwal.bus: 1.
schedule_time = fields.Datetime("Schedule Time", required=True)
2.
bus_id = fields.Many2one("transportasi.bus","Bus", required=True)
3.
driver_id = fields.Many2one("res.partner", "Driver")
4.
passenger_line = fields.Many2many("penumpang.transportasi",
5.
"Passenger") state = fields.Selection([("draft","Draft"),('ok','OK'),('delay','Delay'),('d one','Done'),("cancel")], "State", default="draft")
Tambahkan _rec_name = "bus_id" pada model untuk membuat nama record menjadi nama record bus_id. Buatkan juga jadwal.bus: 1.
tampilan
dan
action
untuk
tranportasi.bus
2.
Bus Form
3.
transportasi.bus
4.
5.
6.
7.
8.
9. 10.
dan
11.
Erlangga Indra Permana
PT Arkana Solusi Digital
Training Odoo Technical
12. 13.
Bus Form
14.
transportasi.bus
15.
16.
17.
19.
20.
22.
23.
24.
26. 27.
28.
29.
30.
31.
32. 33.
34.
35.
36.
37. 38.
39.
40.
41.
42. 43.
44.
45.
46.
47.
48.
49.
50.
51. 52.
53.
Erlangga Permana 54.Indra
PT Arkana Solusi Digital
Training Odoo Technical
Kita dapat menggunakan tag pada tampilan form untuk membuat tab-tab dengan menggunakan . 55.
Buatkan juga tampilan dan action untuk jadwal.bus: 56. 57.
Schedule
58.
jadwal.bus
59.
60.
61.
62.
63.
64.
65.
66. 67.
68.
Erlangga Indra Permana
PT Arkana Solusi Digital
Training Odoo Technical
69. 70.
Schedule
71.
jadwal.bus
72.
73.
74. 75.
76.
77. 78.
79.
80. 81.
82.
83.
84.
85.
86.
87.
88. 89.
90.
91.
92.
Setelah itu tambahkan actionnya: 97.
Sesi terakhir dalam membuat tampilan adalah membuat menu agar user dapat mengakses modelnya.
Erlangga Indra Permana
PT Arkana Solusi Digital
Training Odoo Technical
98. 99. 100.
101. Kita dapat memanggil suatu record dengan menggunakan external identifier, yaitu id dari suatu record yang dideklarasikan pada XML yang dapat diacu dengan format nama_modul.id_record. Contohnya kita memanggil action milik modul base yang akan menampilkan data supplier sebagai data pengemudi bus. Update modul kita dengan mengklik tombol Upgrade pada modul kita atau cara kedua adalah menambahkan parameter -u nama_modul pada command di terminal.
Erlangga Indra Permana
PT Arkana Solusi Digital
Training Odoo Technical
6. Fungsi dan API (Lama vs Baru) Sebuah fungsi adalah atribut dari kelas yang dapat digunakan untuk mengolah suatu data berdasarkan parameter-parameter yang akan menjadi argumen untuk fungsi ketika dipanggil. Kita dapat menggunakan fungsi untuk mengubah nilai dari suatu record dengan menggunakan API yang sudah disediakan Odoo. Setiap method untuk membuat, mengakses, dan mengubah record pada Odoo mempunyai parameter yang sama, yaitu cursor, id user, dan id record. a)
Method di dalam Python Fungsi dimulai dengan kata def kemudian menggunakan titik dua untuk menjabarkan isi fungsinya. Pada Odoo sebuah method yang dapat dipanggil dari antarmuka harus mempunyai argumen untuk parameter cr, uid, ids dimana cr adalah kursor database aktif, uid adalah id dari user berupa integer, dan ids adalah id dari record yang berupa list. def nama_method(self, cr, uid, ids, context): #""" isi statement""" return
Namun sekarang dengan menggunakan API yang baru, cara tersebut dibungkus secara sederhana dengan menggunakan decorator. b)
Decorator Sesuai namanya decorator di Python digunakan untuk mendekorasi nilai pada suatu fungsi. def ganteng(nama): def wrapper(nama): return nama + " ganteng" return wrapper
@ganteng def aku(nama): print nama Dapat kita lihat ketikan menjalankan method aku, parameter nama akan diolah sehingga menambahkan kata ganteng. Begitu juga API yang menggunakan decorator. Kita tidak perlu lagi mengirimkan nilai ke parameter, tetapi sudah bisa merasakan nilai itu secara otomatis. Decorator API yang biasa digunakan adalah: Erlangga Indra Permana
PT Arkana Solusi Digital
Training Odoo Technical
i.
api.multi Mendekorasi nilai cr, uid, dan ids.
ii.
api.model Mendekorasi nilai cr, uid, namun tidak memiliki ids. API ini digunakan data yang tidak memerlukan id atau membuat record baru.
iii. api.depends Mendekorasi nilai cr, uid, dan secara unik dapat mempunyai id untuk yang abstrak sehingga kita tetap dapat mengakses field pada record yang sebenarnya belum tersedia di database. API ini digunakan untuk menghitung nilai field berdasarkan perubahan dari field lainnya. Karena itu API ini memiliki parameter. iv. api.onchange Mendekorasi nilai cr, uid, dan secara unik dapat mempunyai id yang abstrak sehingga kita tetap dapat mengakses field pada record yang sebenarnya belum tersedia di database. API ini digunakan untuk menghitung nilai field berdasarkan perubahan dari field lainnya, karena itu API ini memiliki parameter. c)
Method write, create, unlink, copy i.
create Odoo menggunakan method bernama create untuk membuat sebuah record baru. Kita dapat memanipulasi nilai field sebelum dibuat dengan meng-override method tersebut.
ii.
write Odoo menggunakan method bernama write untuk membuat sebuah record baru. Kita dapat memanipulasi nilai field sebelum dibuat dengan meng-override method tersebut.
iii. unlink Odoo menggunakan method bernama unlink untuk menghapus sebuah. iv. copy Odoo menggunakan method bernama copy untuk membuat sebuah record baru yang berupa salinan dari record lain. Kita dapat memanipulasi nilai field sebelum dibuat dengan meng-override method tersebut. d)
Sequence
Erlangga Indra Permana
PT Arkana Solusi Digital
Training Odoo Technical
Sebuah objek terkadang harus memiliki record urutan sesuai barisan, tanggal, bulan, dan sebagainya untuk memudahkan mengenali suatu data. Kita dapat menggunakan sequence dengan memanfaatkan model ir.sequence. Model ir.sequence dapat membuat urutan untuk suatu model berdasarkan urutan tanggal, bulan, tahun dan sebagainya. Untuk membuat sequence pertama buat sequence untuk model yang kita inginkan. Biasanya sequence dibuat pada saat modul diinstall dengan mendeklarasikannya lewat XML. Buat file XML dengan nama transport_data.xml dan deklarasikan record ir.sequence seperti berikut: 1. 2.
3.
4.
Schedule Bus Sequence
5.
sequence.bus.schedule
6.
SCH/%(range_year)s/
7.
8.
9.
10.
11.
no_gap
12.
4
13. 14.
15.
Tambahkan field name pada jadwal.bus: 1.
name = fields.Char("Name", help="Schedule Name", default="New", readonly=True)
Override method create untuk menambahkan sequence ke dalam field nama.
Erlangga Indra Permana
PT Arkana Solusi Digital
Training Odoo Technical
1. 2.
@api.model def create(self, vals):
3. vals.update({'name':self.env['ir.sequence'].next_by_code("se 4.
quence.bus.schedule")}) return super(Jadwal, self).create(vals)
Dapat kita lihat e)
Method browse dan search i.
browse Method browse digunakan untuk mengakses record. Secara default kata self sendiri dengan menggunakan API baru sudah merujuk pada record aktif. Kita dapat mengakses record lain di dalam model dengan memasukkan nilai id dari record. Nilai id dapat dimasukkan sebagai integer atau dalam susunan list.
self.browse(ids)
self.env['nama.model'].browse(ids)
ii.
search Method search digunakan untuk mencari record berdasarkan kondisi-kondisi tertentu.
self.search([('nama_field','ekspresi',kondisi)])
Operator yang digunanakan mirip dengan operator yang ada saat memberikan kondisi di SQL. iii. search_count Fungsi search_count mirip seperti search, akan tetapi akan mengembalikan nilai berupa long integer.
Erlangga Indra Permana
PT Arkana Solusi Digital
Training Odoo Technical
self.search_count([('nama_field','ekspresi',kondisi)])
f)
Perubahan nilai suatu field terkait nilai field lain Adakalanya suatu field berubah atau berdasarkan nilai field lainnya. Ada 2 cara untuk menghasilkan nilai berdasarkan nilai field lain, yaitu menggunakan field function atau onchange. Perbedaan keduanya adalah nilai field function harus berdasarkan field lain dan tidak menyimpan nilai kecuali kita ingin menyimpannya sedangkan field onchange masih dapat diubah. i.
Field Function Untuk menggunakan field function kita harus memasukkan parameter compute pada field yang kita deklarasikan. Tambahkan fungsi dan field berikut ke dalam jadwal.bus.
4.
@api.multi def _compute_passenger(self): for rec in self: rec.passenger_count = len(rec.passenger_line)
1.
passenger_count = fields.Integer("Passengers",
1. 2. 3.
compute="_compute_passenger")
Ganti field passenger_line pada tree dengan passenger_count. 1.
Selain menggunakan api.multi kita kita juga dapat menggunakan api.depends. Contohnya kita akan menambahkan field umur pada penumpang.transportasi.
Erlangga Indra Permana
PT Arkana Solusi Digital
Training Odoo Technical
1.
age = fields.Integer("Age", compute="_compute_age")
Kita harus mendeklarasikan fungsi yang digunakan untuk menghitung nilai field. Posisi fungsi dapat sebelum atau setelah pendeklarasian field. Sebuah fungsi untuk field biasanya diawali dengan tanda underscore (_), fungsi tersebut tidak dapat dipanggil dengan button. 1. 2. 3. 4. 5. 6.
@api.depends("born_date") def _compute_age(self): for rec in self: born_date = rec.born_date if born_date: rec.age = (datetime.datetime.now() datetime.datetime.strptime(born_date,"%Y-%m-%d")).days/365
Fungsi di atas akan menghitung umur dari tanggal lahir penumpang. Record (self) di-loop terlebih dahulu untuk memastikan bahwa record tersebut singleton, sehingga tidak akan terjadi error saat field ditampilkan pada tree view.
Perbedaannya adalah api.depends akan menghitung ulang nilai field ketika nilai suatu field berubah ketika diedit. Sementara api.multi hanya menghitung saat record diakses. ii.
Field Onchange Cara kedua dapat membuat field yang berasal dari nilai field lain adalah menggunakan api.onchange. Perbedaan dengan depends adalah onchange tidak memerlukan compute, nilai fieldnya masih bisa kita ubah manual, dan nilai field tersimpan di database. Contohnya kita jadwal.bus.
Erlangga Indra Permana
akan
menambahkan
field
onchange
pada
PT Arkana Solusi Digital
Training Odoo Technical
1. 2. 3. 4.
5. 6. 7.
8.
@api.onchange("departure_time") def _onchange_departure(self): if self.departure_time and self.schedule_time: deltime = datetime.datetime.strptime(self.departure_time,"%Y-%m-%d %H:%M :%S") datetime.datetime.strptime(self.schedule_time,"%Y-%m-%d %H:%M: %S") if deltime.total_seconds() > 600: self.state = 'delay' else: self.state = 'ok'
Status dari jadwal akan berubah menjadi delay apabila kita mengubah nilai departure_time lebih 10 menit dari jadwal keberangkatan.
g)
Tombol objek Kita dapat memanggil sebuah fungsi di Python dengan cara menambahkan tombol bertipe object. Tipe object disini dimaksudkan untuk memanggil fungsi pada suatu model.
Erlangga Indra Permana
PT Arkana Solusi Digital
Training Odoo Technical
1.
Kita akan menambahkan tombol Validate, Done, dan Cancel yang akan digunakan ketika sebuah perjalanan sudah selesai dilakukan. 1. 2. 3. 4.
5. 6. 7. 8.
@api.multi def act_run(self): if self.departure_time and self.schedule_time: deltime = datetime.datetime.strptime(self.departure_time,"%Y-%m-%d %H:%M:% S") datetime.datetime.strptime(self.schedule_time,"%Y-%m-%d %H:%M:%S ") if deltime.total_seconds() > 600: self.state = 'delay' else: self.state = 'ok'
@api.multi 10. def act_done(self): 11. self.state = 'done' 9.
12. @api.multi 13. def act_cancel(self): 14.
self.state = 'cancel'
Tambahkan tag di atas tag dan tambahkan di dalam . 1. 2.
3.
4. 5.
Erlangga Indra Permana
PT Arkana Solusi Digital
Training Odoo Technical
Dapat kita lihat sebuah button akan mengubah state dari jadwal menjadi done ketika sudah dinyatakan selesai.
Erlangga Indra Permana
PT Arkana Solusi Digital
Training Odoo Technical
7. Widget a)
Statusbar Widget statusbar adalah jenis widget yang membuat field selection menjadi berseri sehingga memudahkan dalam melihat status record. Caranya tambahkan di dalam atribut widget dan isi dengan statusbar. 1.
Secara default semua isi field akan diperlihatkan, kecuali kita menggunakan statusbar_visible untuk memilih pilihan utama yang akan tampil. Namun pilihan yang tidak ditampilkan pun akan tampil saat field memiliki nilai tersebut.
Erlangga Indra Permana
PT Arkana Solusi Digital
Training Odoo Technical
Data di dalam field menjadi tidak dapat diubah dengan cara diklik, kecuali ada atribut clickable yang bernilai True di dalamnya.
b)
Jenis widget Ada beberapa jenis widget pada Odoo yang mempunyai tempat dalam pemakaiannya, diataranya:
Erlangga Indra Permana
PT Arkana Solusi Digital
Training Odoo Technical
10. Security: Group dan Hak Aksesnya Sebuah modul yang dibuat akan digunakan oleh user. Tentunya seorang user tidak memiliki jabatan yang sama semua dalam sebuah sistem. Ada level yang dapat mengatur alurnya satu sistem dari level atas sehingga mempunyai hak yang lebih banyak dibandingkan user yang bertugas rutin memantau perihal yang lebih dasar. a)
Group Sebuah group adalah hal yang menentukan apakah sebuah menu, record, atau bahkan field dapat dilihat oleh seorang user. Group dapat ditambahkan dengan membuat record pada res.groups. Buat group untuk fungsional modul belajar_odoo dengan membuat file transport_security.xml dan isi dengan berikut: 1. 2.
3. 4.
Transport User
5.
6. 7.
8.
Transport Manager
9.
11. 12. 13.
14.
Jangan lupa untuk selalu menambahkan file XML dan CSV pada manifest. Kita dapat melihat group pada menu Settings→Users→Group. Group sendiri dapat kita tentukan saat membuat user.
Erlangga Indra Permana
PT Arkana Solusi Digital
Training Odoo Technical
Dapat kita lihat group yang kita buat sudah tampil pada saat membuat user. b)
Pembuatan hak akses model Sebuah model harus memiliki hak akses, jika tidak isi menu pada model hanya dapat dilihat oleh superuser saja. Dalam membuat hak akses hal pertama yang harus dilakukan adalah membuat file CSV dengan nama ir.model.access.csv. 1.
id,name,model_id:id,group_id:id,perm_read,perm_write,perm_crea te,perm_unlink
2.
access_penumpang_transportasi_user,access_penumpang_transporta si_user,model_penumpang_transportasi,group_transport_user,1,1, 1,1
3.
access_transportasi_bus_user,access_transportasi_bus_user,mode l_transportasi_bus,group_transport_user,1,1,0,0
4.
access_jadwal_bus_user,access_jadwal_bus_user,model_jadwal_bus ,group_transport_user,1,1,1,1
5.
access_penumpang_transportasi_manager,access_penumpang_transpo rtasi_manager,model_penumpang_transportasi,group_transport_man ager,1,1,1,1
6.
access_transportasi_bus_manager,access_transportasi_bus_manage r,model_transportasi_bus,group_transport_manager,1,1,1,1
7.
access_jadwal_bus_manager,access_jadwal_bus_manager,model_jadw al_bus,group_transport_manager,1,1,1,1
Erlangga Indra Permana
PT Arkana Solusi Digital
Training Odoo Technical
Penjelasan dari beberapa field pada ir.model.access. Field
Keterangan
id
Id dari record.
name
Nama dari record, biasanya disamakan dengan id record di CSV.
model_id:id
Model yang diacu. konvensi model_nama_model.
group_id:id
Group yang dimiliki. Jika dikosongkan tidak terkait sebuah grup, sehingga dapat berpengaruh ke semua user.
perm_read
Izin akses untuk membaca record. Nilai 1 berarti diizinkan, dan 0 berarti tidak diizinkan. Required.
perm_write
Izin akses untuk memperbarui record. Nilai 1 berarti diizinkan, dan 0 berarti tidak diizinkan. Required.
perm_create
Izin akses untuk membuat record. Nilai 1 berarti diizinkan, dan 0 berarti tidak diizinkan. Required.
perm_unlink
Izin akses untuk menghapus record. Nilai 1 berarti diizinkan, dan 0 berarti tidak diizinkan. Required.
Mempunyai penulisan
Kemudian deklarasikan file tersebut di dalam ‘data’ pada manifest. 1. 2.
3.
'data':['transport_security.xml', 'ir.model.access.csv', 'transportasi_view.xml'],
Dapat kita lihat saat ini transport user tidak dapat membuat sebuah data bus. Hanya transport manager yang dapat membuat data bus.
Erlangga Indra Permana
PT Arkana Solusi Digital
Training Odoo Technical
Namun Transport penumpang.
c)
user
masih
bisa
membuat
jadwal
bus
dan
Record level security 1.
2.
Schedule User rule
3.
4.
5.
[('create_uid','=',user.id)]
6.
7.
d)
Field level security
Erlangga Indra Permana
PT Arkana Solusi Digital
Training Odoo Technical
Adakalanya sebuah model mempunyai mengenai field yang hanya dapat diakses oleh kalangan tertentu. Kita dapat menggunakan group untuk menentukan bagian mana yang dapat dilihat oleh user dengan cara menambahkan atribut groups pada elemen . Kita akan menambahkan beberapa field yang hanya dapat dilihat oleh group_transport_manager. Tambahkan field price ke dalam model tranportasi.bus. 1.
price = fields.Float("Price")
Tambahkan fieldnya ke dalam bus_view_form. 1.
..........
2.
3.
4.
5.
6.
..........
Dalam mendeklarasikan groups, id yang dipanggil harus berupa id eksternal. Tambahkan field ke dalam bus_view_tree. 1.
..........
2.
3.
4.
..........
Tambahkan field price, income, expense, dan sub_total ke dalam model jadwal.bus.
Erlangga Indra Permana
PT Arkana Solusi Digital
Training Odoo Technical
1.
income = fields.Float("Income", compute="_compute_money", store=True)
2.
sub_total = fields.Float("Sub Total", compute="_compute_money", store=True)
3.
price = fields.Float("Price")
4.
expense = fields.Float("Expense")
Tambahkan onchange untuk price. 1. 2. 3.
@api.onchange("bus_id") def onchange_bus(self): self.price = self.bus_id.price
Tambahkan fungsi _compute_money untuk field function 1. 2. 3. 4. 5. 6. 7. 8.
@api.depends("price","passenger_line") def _compute_money(self): for rec in self: passenger_count = len(rec.passenger_line) if passenger_count > 0: income = passenger_count * rec.price rec.income = income rec.sub_total_income = income - rec.expense
Sisipkan field price. 1.
..........
2.
3.
4.
..........
Sisipkan field income, schedule_bus_form.
Erlangga Indra Permana
expense,
dan
sub_total
pada
PT Arkana Solusi Digital
Training Odoo Technical
1.
..........
2.
3.
4.
5.
6.
7.
8.
..........
Selain elemen Group sebenarnya bisa juga disisipkan pada elemen , , dan . Selain itu group juga dapat disisipkan di dalam untuk membuat menu hanya dapat dilihat oleh group tersebut.
Erlangga Indra Permana
PT Arkana Solusi Digital
Training Odoo Technical
11. Transient Model dan Wizard Sebuah model terkadang tidak melulu harus menyimpan record. Untuk transaksi sederhana misalnya proses yang berhubungan dengan beberapa model mengaharuskan membuat proses yang menggunakan relasi hanya untuk satu kali proses. Untuk menghemat memori Odoo menyediakan model yang bersifat sementara. a)
Definisi wizard Wizard adalah cara pada Odoo yang menyediakan antarmuka untuk sebuah transaksi yang sifatnya sementara. Setiap kali sebuah wizard memproses data, saat itu juga data dibuat dan akan dihapus kemudian. Pada pendeklarasiaannya mirip seperti mendeklarasikan sebuah tampilan form dan action biasa, namun pada action ditambahkan field target dengan nilai new.
b)
Transient model Pada dasarnya transient model mirip seperti model biasa. Perbedaannya hanyalah transient model tidak menyimpan record selamanya. Oleh karena itu transient model cocok sebagai penampung data temporary, seperti: report, wizard, dan pengaturan pada company.
Untuk membuat wizard pertama kali adalah membuat sebuah transient model. Kita akan membuat wizard yang mengubah bus yang dipilih menjadi berstatus maintenance. 1. 2.
class BusMaintain(models.TransientModel): _name = "bus.maintain.wizard"
3. 4.
bus_ids = fields.Many2many("transportasi.bus", string="Bus")
Erlangga Indra Permana
PT Arkana Solusi Digital
Training Odoo Technical
12. Domain Sebuah domain digunakan untuk menyaring record atau menentukan atribut berdasarkan kondisi. Sebuah domain biasanya memiliki struktur yang sama, yaitu: [(“nama_field”,”ekspresi”,”kondisi”)] a)
Record berdasarkan kondisi Kita dapat memilih record berdasarkan syarat untuk record yang kita inginkan. Pada field many to one kita dapat menambahkan domain pada elemen . 1.
Kita tambahkan domain untuk driver_id pada jadwal.bus sehingga hanya memilih record res.partner yang mempunyai nilai employee sama dengan True. Sisipkan atribut domain pada XML:
Kemudian kita akan mencoba membuat menu yang menampilkan jadwal bus yang masih draft dan menambahkan domain untuk action_schedule_bus agar hanya memilih jadwal selain draft. 1.
Serta kita tambahkan action yang hanya memilih record yang berupa draft.
Erlangga Indra Permana
PT Arkana Solusi Digital
Training Odoo Technical
1.
b)
Tree view decoration Kita dapat menandakan record yang memiliki kondisi tertentu pada datanya. 1.
Erlangga Indra Permana
PT Arkana Solusi Digital
Training Odoo Technical
13. Attribute Field a)
Invisible Kita dapat menyembunyikan sebuah elemen pada tampilan di dalam tampilan dengan menggunakan atribut invisible yang diberi nilai True. Namun kita juga dapat membuat sebuah elemen tidak dapat dilihat berdasarkan kondisi dari suatu field. 1.
2.
string="Cancel"
Readonly Atribut readonly digunakan untuk membuat field pada tampilan tidak dapat diubah dengan nilai dengan cara menyisipkan atribut readonly di dalam field. Namun kita juga dapat membuat sebuah elemen tidak dapat dilihat berdasarkan kondisi dari suatu field.
1.
attrs="{'readonly':[('state','=','done')]}"
Erlangga Indra Permana
PT Arkana Solusi Digital
Training Odoo Technical
14. Constraint Sebuah record dapat mempunyai aturan-aturan untuk data recordnya, seperti field tanggal lahir pada record harus kurang dari hari ini, nama record harus unique dan sebagainya. a)
SQL constraint Kita dapat menambahkan constraint pada tabel dengan menambahkan variabel _sql_constraints pada kelas. 1.
_sql_constraints = [('nama_constraint', 'operasi', _("Warning
saat melanggar constraint"))]
Cara pertama ini dianjurkan bagi constraint field yang masih bisa digunakan pada SQL, seperti unique dan check. Adapun not null kita menggunakan required pada saat pendeklarasian field, karena akan berpengaruh juga pada view. b)
API constraint Selain constrain dengan menggunakan SQL, Odoo juga dapat disisipkan constraint dengan menggunakan Python dengan menggunakan api.constrains yang mempunyai parameter untuk field yang diberi constraint. Sebelum menggunakan api.constrains ValidationError pada odoo.exceptions.
import
dahulu
from odoo.exceptions import ValidationError
Kita akan menambahkan constraint untuk umur driver. Apabila umur driver lebih dari 52 tahun, maka akan keluar sebuah warning. 1. 2. 3. 4. 5.
6.
@api.constrains("driver_id") def _age_constraint(self): driver_id = self.driver_id if driver_id.born_date: if (datetime.datetime.strptime(driver_id.born_date,"%Y-%m-%d").year datetime.datetime.now().year)