Tanya Komunitas: Cara Implementasi Transient Model Odoo untuk Form Wizard & Proses Sementara
Diposting pada 16 Jun 2026, 00:45
Ditanyakan oleh: Fahmi
Halo teman-teman praktisi Odoo di sini!
Saya Fahmi dari tim IT di perusahaan. Saat ini kami sedang mengembangkan beberapa modul kustom di Odoo, dan saya lagi kepikiran untuk bikin form wizard atau proses data sementara yang nanti datanya nggak perlu disimpan permanen di database, jadi setelah selesai diproses ya datanya hilang otomatis.
Nah, dari yang saya baca, kayaknya Transient Model itu paling cocok ya untuk kasus kayak gini? Saya mau tanya, bagaimana ya best practice atau langkah-langkah yang direkomendasikan untuk membuat Transient Model di Odoo?
Apakah ada contoh sederhana atau tips khusus yang perlu diperhatikan, terutama dalam hal definisi modelnya, pembuatan view-nya (form dan action), dan cara menghubungkannya dengan action atau button di modul lain? Mungkin juga ada hal-hal terkait hak akses atau cleanup data yang perlu jadi perhatian?
Terima kasih banyak atas pencerahannya ya! Semoga ada yang bisa sharing pengalamannya.
Balasan (1)
Admin Odoo ForumAdmin & AI Support16 Jun 2026, 00:46
Halo Mas Fahmi, selamat bergabung di komunitas Odoo Indonesia! Senang sekali bisa berdiskusi soal pengembangan kustom di Odoo.
Pertanyaannya sangat relevan dan memang Transient Model itu solusi yang pas banget untuk kasus seperti yang Mas Fahmi jelaskan, yaitu form wizard atau proses data sementara yang tidak perlu disimpan permanen. Konsepnya sudah betul sekali!
Yuk, kita bedah bareng bagaimana best practice dan langkah-langkahnya.
### Apa Itu Transient Model di Odoo?
Secara singkat, Transient Model adalah tipe model khusus di Odoo yang dirancang untuk menyimpan data sementara. Bedanya dengan `models.Model` (model standar), data di `models.TransientModel` ini akan dihapus secara otomatis oleh Odoo setelah jangka waktu tertentu (biasanya beberapa jam atau hari, diatur oleh cron job `Ir.model.cleanup.wizard`).
Ini sangat ideal untuk: Form Wizard: Proses multi-step atau input data sementara sebelum melakukan aksi final. Laporan Sementara: Menampung hasil komputasi sebelum diekspor atau ditampilkan. Konfirmasi Aksi: Menampilkan pop-up konfirmasi dengan pilihan tambahan sebelum mengeksekusi sesuatu.
### Langkah-langkah Rekomendasi Membuat Transient Model
Mari kita buat kerangkanya.
#### 1. Definisi Model Python (`models.py`)
Ini adalah inti dari Transient Model Anda.
Inherit dari `models.TransientModel`: Pastikan model Anda mewarisi kelas ini. Definisi Field: Tentukan field-field yang Anda butuhkan untuk input atau menampung data sementara, sama seperti model biasa.
Contoh sederhana:
```python from odoo import models, fields, api
class MyTransientWizard(models.TransientModel): _name = 'my.transient.wizard' _description = 'Wizard for Temporary Process'
@api.model def default_get(self, fields_list): res = super().default_get(fields_list) # Contoh, jika ingin mengambil data dari context saat wizard dibuka if self._context.get('active_id') and self._context.get('active_model') == 'res.partner': partner = self.env['res.partner'].browse(self._context.get('active_id')) res['input_text'] = f"Processing for Partner: {partner.name}" return res
def action_process_data(self): self.ensure_one() # Pastikan hanya 1 record wizard yang diproses
# Lakukan logika pemrosesan data di sini # Misalnya, update field di model lain, generate laporan, dll. # Data dari wizard bisa diakses melalui `self.input_text`, `self.process_date`
# Contoh sederhana: processed_data = f"Data '{self.input_text}' diproses pada {self.process_date}." # Misalnya, kita bisa mengupdate field result_message di wizard itu sendiri self.write({'result_message': processed_data + "nProses selesai!"})
# Untuk kasus wizard yang perlu memicu aksi lain setelah selesai, # Anda bisa mengembalikan action lain, misalnya membuka view model lain. # return { # 'type': 'ir.actions.act_window', # 'name': 'Model Tujuan', # 'res_model': 'res.partner', # 'view_mode': 'form', # 'res_id': self._context.get('active_id'), # 'target': 'current', # }
# Jika hanya ingin menutup wizard, tidak perlu return apa-apa # atau return {'type': 'ir.actions.act_window_close'} # Karena kita update result_message, wizard akan tetap terbuka menampilkan result. # Jika ingin langsung menutup dan tidak ada perubahan tampilan, return empty dictionary {} return {} ```
#### 2. Definisi View XML (`views/my_wizard_views.xml`)
Anda memerlukan view untuk menampilkan form wizard Anda.
Form View: Definisikan tampilan form untuk Transient Model Anda. Window Action: Buat `ir.actions.act_window` agar wizard bisa dipanggil.
```xml
my.transient.wizard.form my.transient.wizard
Open Temporary Process Wizard my.transient.wizard form new
``` Perhatikan `target="new"` pada `ir.actions.act_window`. Ini akan membuat wizard terbuka sebagai pop-up atau dialog baru, bukan mengambil alih halaman utama. Ini adalah praktik terbaik untuk wizard.
#### 3. Menghubungkan Wizard dengan Action/Button di Modul Lain
Biasanya, wizard dipanggil dari button pada form view model lain.
Tambahkan button pada form view model target (`views/res_partner_views.xml`):
```xml
res.partner.form.inherit.my.module res.partner
``` Pada button ini, `type="action"` akan memicu `ir.actions.act_window` yang telah kita definisikan untuk Transient Model. `context="{...}"` sangat penting. Ini akan mengirimkan informasi tentang record yang sedang aktif (`active_id`, `active_model`) ke Transient Model, sehingga Anda bisa menggunakan data tersebut untuk inisialisasi wizard (seperti di method `default_get` yang saya contohkan di atas).
#### 4. Hak Akses (Security)
Meskipun datanya sementara, Transient Model tetap membutuhkan hak akses (record rules dan access rights) agar pengguna bisa `create`, `read`, `write`, `unlink` wizard tersebut. Tanpa ini, pengguna mungkin tidak bisa membuka atau menggunakan wizard.
Buat file `security/ir.model.access.csv`:
```csv id,name,model_id:id,group_id:id,perm_read,perm_write,perm_create,perm_unlink access_my_transient_wizard,my.transient.wizard.access,model_my_transient_wizard,,1,1,1,1 ``` `model_my_transient_wizard` adalah id eksternal dari model Anda, biasanya `model_nama_model_snake_case`.
#### 5. Data Cleanup
Odoo memiliki cron job bawaan bernama "Cleanup of Transient Models" yang berjalan secara periodik (default-nya setiap jam 1 malam, atau bisa disesuaikan). Cron job ini akan menghapus semua record dari `models.TransientModel` yang usianya lebih dari batas waktu yang ditentukan (default 1 hari). Jadi, Mas Fahmi tidak perlu khawatir memikirkan cleanup manual; Odoo sudah menanganinya secara otomatis.
### Tips Khusus yang Perlu Diperhatikan
Minimalis & Fokus: Desain wizard agar simpel dan fokus pada satu tujuan. Jangan sampai wizard terlalu panjang atau kompleks, karena akan membingungkan pengguna. Inisialisasi Data: Manfaatkan method `default_get` di Transient Model Anda untuk mengisi nilai default di form wizard berdasarkan konteks dari mana wizard itu dipanggil (misalnya, data dari record yang sedang dibuka). Validasi: Lakukan validasi data input di Transient Model (misalnya dengan `constrains` atau `onchange` method) sebelum proses utama dijalankan. Feedback Pengguna: Setelah proses di wizard selesai, pertimbangkan untuk memberikan feedback ke pengguna, misalnya dengan menampilkan pesan sukses, membuka record yang baru dibuat, atau mengarahkan kembali ke view sebelumnya. Ini bisa dilakukan dengan mengembalikan `ir.actions.act_window` yang sesuai dari method button.
Semoga penjelasan dan contoh ini memberikan gambaran yang jelas ya, Mas Fahmi! Transient Model adalah fitur yang sangat powerful untuk meningkatkan pengalaman pengguna dalam alur kerja yang kompleks.
Kalau ada bagian yang masih kurang jelas atau ingin didiskusikan lebih lanjut, jangan sungkan untuk bertanya lagi di sini. Sukses terus untuk pengembangan modul kustomnya!
Berikan Tanggapan
⚠️ Anti-Spam Aktif: Dilarang menyertakan tautan/URL di dalam form ini.