openSOURCE

openSOURCE

Did You Know?

All your business on one platform

Odoo Dev FAQs

Manifest & init (Python) — metadata modul & assets

Estimated reading: 5 minutes 47 views

Selamat datang di bagian ketujuh FAQ OdooCamp: Manifest & init (Python) — metadata modul & assets. Prolog ini menjadi pengantar sebelum kita masuk ke pertanyaan teknis yang sering diajukan developer tentang file __manifest__.py dan __init__.py pada Odoo 18 CE.


Mengapa Manifest & Init Penting?

Keduanya adalah titik masuk modul:

  • __manifest__.py: mendeskripsikan modul (nama, versi, dependensi, berkas data, bundel assets, lisensi, dsb.) dan menginstruksikan bagaimana Odoo memuatnya.

  • __init__.py: mendaftarkan paket Python modul (import models/, wizard/, controllers/, utilitas), sehingga ORM & controller dikenali saat modul di‑install/upgrade.

Dengan memahami dua berkas ini, kita mengendalikan lifecycle modul: install, upgrade, uninstall, urutan load data, serta assets (JS/SCSS) untuk UI.


Mindset Kerja

Metadata → Dependensi → Data & Keamanan → Assets → Hooks → Import Paket

  • Metadata: nama, kategori, versi, lisensi, pengembang.

  • Dependensi: modul yang harus aktif dulu agar referensi (model/view/menu) valid.

  • Data & Keamanan: urutan load security/, data/, views/, report/, demo/.

  • Assets: pendaftaran JS/SCSS ke bundle backend/frontend/report.

  • Hooks: fungsi Python pre_init, post_init, uninstall untuk skenario khusus.

  • Init: impor modul Python agar model & controller ter‐daftar.


Ruang Lingkup yang Akan Kita Bahas di FAQ Manifest & Init

  1. Anatomi __manifest__.py dan kunci penting (name, version, depends, data, assets, license, application, auto_install).

  2. Urutan & strategi load data (security, data, views, report, demo).

  3. Pendaftaran assets (backend, frontend, report, primary variables).

  4. Hooks: pre_init_hook, post_init_hook, uninstall_hook — kapan dan bagaimana memakainya.

  5. Anatomi __init__.py dan struktur paket Python yang benar.

  6. Diagnostik: error dependensi, missing data, assets tidak ter‑load, siklus upgrade.


Anatomi Dasar __manifest__.py

# __manifest__.py
{
    "name": "My Module",
    "summary": "Contoh modul OdooCamp",
    "version": "18.0.1.0.0",
    "category": "Productivity",
    "website": "https://odoo.camp",
    "author": "OdooCamp Team",
    "license": "LGPL-3",

    # Modul yang wajib ada lebih dulu
    "depends": ["base", "web"],

    # Urutan file data saat install/upgrade
    "data": [
        "security/ir.model.access.csv",  # akses harus duluan
        "security/security.xml",
        "data/sequence.xml",
        "views/my_model_views.xml",
        "report/my_report.xml",
        "report/my_report_templates.xml",
        # dst.
    ],

    # Data contoh (hanya saat install dengan demo data)
    "demo": [
        "demo/demo_data.xml",
    ],

    # Pendaftaran assets (JS/SCSS) ke bundle
    "assets": {
        "web._assets_primary_variables": [
            "my_module/static/src/scss/variables.scss",
        ],
        "web.assets_backend": [
            "my_module/static/src/js/my_action.js",
            "my_module/static/src/scss/backend.scss",
        ],
        "web.assets_frontend": [
            "my_module/static/src/scss/frontend.scss",
        ],
        "web.report_assets_common": [
            "my_module/static/src/scss/report_common.scss",
        ],
        "web.report_assets_pdf": [
            "my_module/static/src/scss/report_pdf.scss",
        ],
    },

    # Hooks opsional
    "pre_init_hook": "pre_init",
    "post_init_hook": "post_init",
    "uninstall_hook": "uninstall",

    # Atribut umum
    "installable": True,
    "application": False,   # True jika muncul sebagai aplikasi di Apps
    "auto_install": False,  # True jika otomatis terpasang saat dependensi terpenuhi
}

Catatan penting:

  • depends memengaruhi urutan load. Jika kita mereferensi view/model dari modul lain, pastikan modul itu sudah ada di depends.

  • data dieksekusi pada install dan upgrade; demo hanya saat install database dengan demo data.

  • assets memastikan file front‑end kita ikut dibundel dan tersedia di UI.


Pendaftaran Hooks (Contoh)

# hooks.py (opsional, atau di __init__.py)
from odoo import api, SUPERUSER_ID

def pre_init(cr):
    # Migrasi ringan sebelum registry siap (akses via cursor cr)
    pass

def post_init(cr, registry):
    # Inisialisasi data setelah modul terpasang & registry siap
    env = api.Environment(cr, SUPERUSER_ID, {})
    # contoh: set default config, generate sequence, dsb.


def uninstall(cr, registry):
    # Bersih-bersih saat uninstall (hapus data sementara, dsb.)
    pass

Rujuk fungsi ke manifest melalui nama stringnya: "pre_init_hook": "pre_init", dsb.


Anatomi Dasar __init__.py

# __init__.py
from . import models
from . import wizard
from . import controllers
# dari sinilah Odoo mengetahui paket Python apa yang harus dimuat

Struktur paket:

my_module/
├─ __init__.py          # import subpackages agar dimuat
├─ __manifest__.py      # metadata & instruksi load
├─ models/
│  ├─ __init__.py       # from . import my_model, ...
│  └─ my_model.py
├─ wizard/
│  ├─ __init__.py
│  └─ my_wizard.py
├─ controllers/
│  ├─ __init__.py
│  └─ main.py
└─ static/ ...          # js/scss/images/description

Best practice __init__.py:

  • Import paket, bukan setiap file satu‑satu, kecuali perlu urutan khusus.

  • Hindari eksekusi kode berat di import; simpan logika ke method/model.


Urutan & Strategi Load Data

  1. Security terlebih dahulu: ir.model.access.csv, record rules.

  2. Data pendukung: sequence, parameter, server action.

  3. Views & report: setelah model & security siap.

  4. Demo: opsional, hanya untuk data contoh.

Strategi noupdate: untuk data yang tidak boleh di‑update saat upgrade, bungkus di XML dengan noupdate="1".


Best Practices (Do/Don’t)

Do

  • Pastikan depends lengkap dan relevan; hindari dependensi berlebihan.

  • Urutkan data secara logis: security → data → views → report → (opsional) post‑data.

  • Daftarkan semua assets di manifest; hindari penyisipan manual di view kecuali perlu.

  • Dokumentasikan hooks: kapan dijalankan dan apa efeknya.

Don’t

  • Jangan meletakkan SQL berat di pre_init_hook tanpa alasan kuat.

  • Jangan memodifikasi record inti tanpa noupdate/rencana upgrade yang jelas.

  • Jangan lupa menambahkan security/ir.model.access.csv untuk setiap model baru.


Debugging & Diagnostik

  • Dependensi hilang: error saat install → periksa depends di manifest.

  • Data tidak termuat: cek urutan data dan referensi XML ID.

  • Assets tidak muncul: pastikan path benar di assets, upgrade modul, bersihkan cache browser (Ctrl+F5), Developer Mode.

  • Hooks gagal: lihat log server, pastikan signature fungsi sesuai (pre_init(cr), post_init(cr, registry)).


Checklist Sebelum Masuk ke FAQ Detail

  • __manifest__.py berisi metadata yang lengkap (name, version, license, depends).

  • Urutan file data benar (security → data → views → report → demo).

  • Assets JS/SCSS didaftarkan di bundle yang tepat (backend/frontend/report/variables).

  • Hooks (jika ada) didefinisikan dan direferensikan dengan benar.

  • __init__.py mengimpor paket yang diperlukan (models/wizard/controllers).


Yang Akan Kita Jawab di FAQ Manifest & Init

  • Cara memilih bundle assets yang tepat & dampak urutannya.

  • Kapan memakai pre_init_hook vs post_init_hook.

  • Strategi noupdate dan manajemen data inti saat upgrade.

  • Pola struktur paket Python yang bersih dan mudah dirawat.

  • Tips mengatasi error umum saat install/upgrade akibat manifest yang kurang tepat.

Dengan prolog ini, kita siap melangkah ke FAQ Manifest & init (Python) — metadata modul & assets dan membahas praktik konkret yang sering kita temui di proyek Odoo 18 CE.

Leave a Comment

Share this Doc

Manifest & init (Python) — metadata modul & assets

Or copy link

CONTENTS