Traning Odoo Technical [PDF]

  • 0 0 0
  • Suka dengan makalah ini dan mengunduhnya? Anda bisa menerbitkan file PDF Anda sendiri secara online secara gratis dalam beberapa menit saja! Sign Up
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)