openSOURCE

openSOURCE

Did You Know?

All the tech in one platform

Odoo Dev FAQs

CSV — akses & seed data

Estimated reading: 5 minutes 33 views

Selamat datang di bagian keenam FAQ OdooCamp: CSV — akses & seed data. Prolog ini menyiapkan peta kerja dan prinsip dasar sebelum kita masuk ke pertanyaan teknis yang paling sering diajukan developer terkait hak akses (ACL) dan pengisian data awal menggunakan CSV pada Odoo 18 CE.


Mengapa CSV Penting di Odoo?

CSV adalah format yang ringan, dapat dibaca manusia, dan mudah dikelola versi (git). Di Odoo, CSV dipakai untuk:

  • Hak akses model (ACL): file khusus security/ir.model.access.csv.

  • Seed data (data awal/lookup/master): produk, kategori, sequence, dsb., biasanya di folder data/ atau demo/.

Dengan CSV, kita bisa melakukan bulk create/update yang stabil melalui external ID, serta memudahkan sinkronisasi antar environment (dev/stage/prod).


Mindset Kerja

Model & Field → Struktur CSV → External ID → Load via Manifest

  • Tentukan model & field yang akan diisi.

  • Siapkan header kolom sesuai field/relasi model.

  • Gunakan external ID (kolom id) agar record dapat di‑update saat upgrade modul.

  • Muat berkas CSV lewat __manifest__.py (data/demo) pada urutan yang benar.


Ruang Lingkup yang Akan Kita Bahas di FAQ CSV

  1. ir.model.access.csv: format, contoh, dan urutan load.

  2. Seed data: struktur CSV untuk model biasa.

  3. Relasi: Many2one/Many2many melalui notasi field:id.

  4. Manifest: data vs demo, urutan, dan strategi upgrade.

  5. Diagnostik: error umum dan cara melacaknya.


Anatomi — security/ir.model.access.csv

Format baku (kolom wajib):

id,name,model_id:id,group_id:id,perm_read,perm_write,perm_create,perm_unlink

Contoh minimal:

access_my_model_user,access.my.model.user,model_my_model,base.group_user,1,1,1,0
access_my_model_manager,access.my.model.manager,model_my_model,base.group_system,1,1,1,1

Penjelasan singkat:

  • id → external ID ACL (unik per modul).

  • name → label bebas (tidak harus unik global).

  • model_id:id → referensi ke XML ID model, biasanya model_<nama_model> yang dideklarasikan otomatis oleh Odoo.

  • group_id:id → XML ID grup (boleh kosong untuk akses publik/semua user login).

  • perm_* → 0/1 untuk read, write, create, unlink.

Urutan load yang umum di manifest: pastikan ACL dimuat sebelum data yang butuh akses menulis/menampilkan.


Seed Data — Struktur CSV untuk Model Biasa

Header & External ID

  • Sertakan kolom id (external ID) agar saat upgrade, baris yang sama di‑update alih‑alih dibuat ulang.

  • Kolom lain mengikuti nama field pada model.

Contoh (data/product_category.csv):

id,name,parent_id:id,property_account_income_categ_id:id
cat_services,Services,,account.data_account_type_revenue
cat_parts,Parts,cat_services,

Keterangan:

  • parent_id:id mereferensikan external ID lain di kolom parent_id.

  • Untuk Many2one, gunakan notasi field:id dan isi nilai dengan XML ID target.

Many2many

  • Gunakan notasi field:id dengan daftar XML ID dipisahkan koma.

Contoh (data/product_template_tag.csv):

id,name
pt_tag_promo,Promo
pt_tag_featured,Featured

Contoh relasi Many2many pada produk:

id,name,categ_id:id,tag_ids:id
prod_consulting,Consulting Service,cat_services,pt_tag_promo,pt_tag_featured

Catatan: beberapa versi Odoo mengizinkan multi‑nilai pada satu sel CSV Many2many dengan pemisah koma. Jika tidak bekerja sesuai harapan, alternatifnya adalah mengelola relasi melalui model relasi (O2M ke tabel many2many khusus) atau memakai XML data.

Tipe Data & Format

  • Boolean: 1/0 atau True/False.

  • Tanggal: format YYYY-MM-DD.

  • Datetime: format YYYY-MM-DD HH:MM:SS (UTC), sejajar dengan konfigurasi server.

  • Monetary/Float: gunakan titik desimal.


Memuat CSV via __manifest__.py

Contoh ringkas:

# __manifest__.py
{
    "name": "my_module",
    "version": "1.0",
    "depends": ["base", "product"],
    "data": [
        "security/ir.model.access.csv",   # muat ACL dulu
        "data/product_category.csv",      # seed data kategori
        "data/product_template.csv",      # seed data produk
    ],
    "demo": [
        "demo/demo_data.csv",             # hanya saat install dengan demo data
    ],
}

Catatan strategi:

  • data dieksekusi pada install dan upgrade modul.

  • demo dieksekusi hanya pada install jika database dibuat dengan demo data.

  • Jika Anda butuh kontrol noupdate, gunakan XML wrapper untuk memuat CSV dengan atribut noupdate="1" (karena CSV murni tidak memiliki flag ini).

Contoh XML wrapper (opsional):

<odoo noupdate="1">
  <data>
    <record id="load_product_category_csv" model="ir.actions.server">
      <!-- Atau gunakan <function> ir.model.data untuk memanggil loader khusus -->
    </record>
  </data>
</odoo>

Best Practices (Do/Don’t)

Do

  • Gunakan kolom id (external ID) selalu untuk data yang harus dapat di‑update.

  • Pisahkan CSV per topik/model agar mudah dirawat (mis. kategori, produk, pajak).

  • Pastikan dependensi modul di manifest benar, agar referensi field:id valid saat load.

  • Uji di database bersih dan upgrade modul untuk memastikan perilaku create/update konsisten.

Don’t

  • Jangan memuat data dalam jumlah besar tanpa external ID → berisiko duplikasi saat upgrade.

  • Jangan mengandalkan urutan data yang salah; relasi gagal jika target belum ada.

  • Jangan mencampur data konfigurasi permanen dengan demo; pisahkan di data/ vs demo/.


Diagnostik & Error Umum

  • ValueError: External ID not found → referensi field:id menunjuk XML ID yang belum dimuat; cek urutan load dan dependensi modul.

  • IntegrityError (constraint/unique) → ada duplikasi nilai unik; pastikan eksternal ID/field unik tidak bentrok.

  • Hak akses ditolak saat load → ACL belum dimuat; pastikan ir.model.access.csv berada lebih awal dalam daftar data.

  • Tipe data salah → format tanggal/datetime/boolean/float tidak sesuai; sesuaikan dengan standar Odoo.


Checklist Sebelum Masuk ke FAQ Detail

  • Semua CSV memiliki header yang benar dan konsisten dengan nama field model.

  • Baris memiliki id (external ID) unik per modul.

  • Relasi Many2one/Many2many memakai notasi field:id dan mengacu ke XML ID yang valid.

  • Urutan load di manifest memastikan dependensi dan ACL tersedia lebih dulu.

  • Sudah diuji di install baru dan upgrade modul untuk memverifikasi update alih‑alih duplikasi.


Yang Akan Kita Jawab di FAQ CSV

  • Format pasti ir.model.access.csv dan kombinasi izin yang lazim per peran.

  • Cara efektif mengisi master data via CSV, termasuk relasi antar model.

  • Strategi noupdate untuk CSV dengan XML wrapper.

  • Teknik menghindari duplikasi dan menjaga data idempoten saat upgrade.

  • Tips debugging error load CSV yang sering muncul di proyek nyata.

Dengan prolog ini, kita siap melangkah ke FAQ CSV — akses & seed data dan membahas praktik konkret yang sering terjadi dalam pengembangan modul Odoo 18 CE.

Leave a Comment

Share this Doc

CSV — akses & seed data

Or copy link

CONTENTS