Szeto Consultants

Odoo Dev: Bagaimana Cara Membuat Fungsi/Method Global yang Bisa Diakses Lintas Modul?

Odoo Dev: Bagaimana Cara Membuat Fungsi/Method Global yang Bisa Diakses Lintas Modul?

Diposting pada 04 Jun 2026, 19:57
Ditanyakan oleh: Ridwan

Halo rekan-rekan praktisi dan developer Odoo di sini!

Saya Ridwan dari tim IT perusahaan. Saat ini kami cukup intens menggunakan Odoo ERP, dan dalam pengembangan kustomisasi, saya sering menemukan beberapa fungsi yang logic-nya mirip atau bahkan sama persis di beberapa modul yang berbeda. Misalnya, ada validasi data tertentu atau perhitungan standar yang perlu dipanggil dari berbagai object atau model.

Nah, untuk menghindari duplikasi kode (DRY principle) dan memudahkan maintenance ke depannya, saya terpikir untuk membuat sebuah method yang sifatnya 'global' atau bisa diakses dari berbagai model atau modul tanpa perlu menulis ulang kodenya.

Pertanyaan saya:
1. Apa praktik terbaik (best practice) untuk membuat method semacam ini di Odoo?
2. Idealnya, di mana lokasi yang paling tepat untuk mendefinisikan method 'global' tersebut? Apakah di `models/base.py`, di sebuah modul utility terpisah, atau ada cara lain yang lebih elegan?
3. Bagaimana cara memanggil atau mengakses method tersebut dari model atau object lain di modul yang berbeda?

Mohon pencerahannya dari rekan-rekan yang sudah berpengalaman. Jujur saya masih meraba-raba yang paling efisien dan sesuai kaidah Odoo.

Terima kasih banyak atas bantuannya!

Balasan (1)

Admin Odoo ForumAdmin & AI Support04 Jun 2026, 19:57
Halo Mas Ridwan! Wah, pertanyaan yang sangat relevan nih dan sering jadi concern para developer Odoo yang mau kodenya rapi dan mudah di-maintain. Prinsip DRY (Don't Repeat Yourself) itu penting banget dalam pengembangan software, termasuk di Odoo!

Mari kita bahas satu per satu ya, Mas, biar kodenya Mas Ridwan makin efisien dan terstruktur.




1. Praktik Terbaik (Best Practice) untuk Membuat Method Global

Untuk membuat method yang sifatnya 'global' atau reusable lintas modul di Odoo, praktik terbaiknya adalah dengan membuat Mixin Class di dalam modul terpisah.

Mixin Class: Ini adalah kelas Python biasa yang berisi kumpulan method atau logic yang ingin Mas Ridwan bagikan ke berbagai model. Kelas ini tidak perlu inherit `models.Model` secara langsung, karena tujuannya bukan untuk menjadi model database, melainkan untuk 'disuntikkan' ke model lain.
Dengan Mixin Class, Mas Ridwan bisa menerapkan Multiple Inheritance di model Odoo yang ingin menggunakan logic tersebut. Jadi, model Mas Ridwan akan inherit dari `models.Model` (atau model Odoo lainnya yang sudah ada) DAN dari Mixin Class yang Mas Ridwan buat.

Kenapa Mixin Class?
Modularitas: Logic global terpusat di satu tempat yang jelas.
Reusability: Sangat mudah digunakan di banyak model tanpa perlu menulis ulang kode.
Maintenance: Jika ada perubahan pada logic global, Mas Ridwan cukup mengubah di satu tempat saja, yaitu di Mixin Class tersebut.
Sesuai Kaidah Odoo: Ini adalah cara yang umum dan diakui dalam pengembangan Odoo untuk berbagi kode dan menghindari duplikasi.




2. Lokasi Paling Tepat untuk Mendefinisikan Method 'Global'

Idealnya, Mas Ridwan harus membuat modul kustom terpisah yang khusus berisi Mixin Class atau helper function yang sifatnya utility.

Contoh Nama Modul: Mas Ridwan bisa beri nama yang deskriptif, seperti `my_custom_utilities`, `my_shared_addons`, atau `my_common_mixins`.
Struktur Modul: Di dalam modul ini, Mas Ridwan bisa membuat folder `models/` dan di dalamnya ada file Python (misalnya `my_mixins.py` atau `common_functions.py`) untuk mendefinisikan Mixin Class-nya. Lalu, jangan lupa import di file `__init__.py` di dalam folder `models/` tersebut.

Menaruhnya di `models/base.py` sangat tidak disarankan ya, Mas. Itu adalah file inti Odoo yang sebaiknya tidak dimodifikasi untuk logika bisnis kustom. Modifikasi langsung pada file inti Odoo bisa menyebabkan masalah serius saat upgrade Odoo atau saat ada konflik dengan modul lain.

Membuat modul utility terpisah ini adalah cara paling elegan, rapi, dan sesuai kaidah Odoo, karena menjaga kode kustom Mas Ridwan terorganisir, mudah ditemukan, dan tidak mengganggu core Odoo.




3. Cara Memanggil atau Mengakses Method Tersebut

Oke, setelah Mixin Class Mas Ridwan dibuat di modul utility terpisah, cara memanggilnya sangat mudah:

Langkah 1: Tambahkan Modul Utility sebagai Dependensi
Pastikan modul yang ingin menggunakan method global tersebut memiliki dependensi (di file `__manifest__.py`-nya) ke modul utility yang Mas Ridwan buat. Contohnya:
`'depends': ['base', 'my_custom_utilities'],`
Langkah 2: Import dan Inherit Mixin Class
Di file model Mas Ridwan (`models/nama_model_anda.py`) yang ingin menggunakan method tersebut, import Mixin Class-nya, lalu gunakan multiple inheritance.

Mari kita ilustrasikan dengan contoh kode:

Misalnya, Mixin Class Mas Ridwan bernama `MyGlobalMixin` yang didefinisikan di modul `my_custom_utilities` dalam file `models/my_mixins.py`.

```python
# ---------- Kode di modul my_custom_utilities/models/my_mixins.py ----------
# (Jangan lupa import file ini di my_custom_utilities/models/__init__.py)
class MyGlobalMixin:
def my_global_validation_method(self, value):
if not isinstance(value, (int, float)) or value < 0:
self.env.cr.rollback() # Contoh rollback transaksi jika validasi gagal
raise ValueError("Nilai harus angka positif!")
# Logic validasi global lainnya di sini
return True

def my_global_calculation(self, num1, num2):
return num1 num2
```

```python
# ---------- Kode di modul_anda/models/nama_model_anda.py ----------
# (Pastikan modul_anda memiliki dependensi ke my_custom_utilities)
from odoo import models, fields
# Import Mixin Class dari modul utility
from odoo.addons.my_custom_utilities.models.my_mixins import MyGlobalMixin

class YourCustomModel(models.Model, MyGlobalMixin): # Inherit dari models.Model DAN MyGlobalMixin
_name = 'your.custom.model'
_description = 'Your Custom Model Description'

name = fields.Char(string='Name')
value_to_process = fields.Integer(string='Value to Process', default=0)

def action_process_data(self):
self.ensure_one() # Pastikan hanya satu record yang diproses

# Memanggil method dari MyGlobalMixin
try:
# Memanggil method validasi global
is_valid = self.my_global_validation_method(self.value_to_process)
if is_valid:
print("Data Valid! Lanjut proses...")
# Memanggil method perhitungan global
calculated_result = self.my_global_calculation(self.value_to_process, 10)
print(f"Hasil Perhitungan Global: {calculated_result}")
# ... logika bisnis lainnya ...
except ValueError as e:
print(f"Error Validasi: {e}")
# Contoh menampilkan pesan error ke user di UI
# raise UserError(str(e))
```

Dengan cara ini, Mas Ridwan bisa memanggil method `my_global_validation_method` atau `my_global_calculation` langsung dari instance model `YourCustomModel` (misalnya `self.my_global_validation_method(...)`) seolah-olah method tersebut didefinisikan langsung di dalam model tersebut. Mixin class ini bisa mengakses `self` (recordset) dan semua fungsionalitas ORM Odoo lainnya.

Ini adalah pendekatan yang paling efisien, rapi, dan sesuai kaidah Odoo untuk mencapai tujuan Mas Ridwan.

Semoga pencerahannya membantu ya, Mas Ridwan! Jangan sungkan bertanya lagi kalau ada yang kurang jelas atau butuh contoh kasus lainnya. Semangat ngodingnya!

Berikan Tanggapan

⚠️ Anti-Spam Aktif: Dilarang menyertakan tautan/URL di dalam form ini.
Butuh Konsultasi Odoo? 👋
Scroll to Top