Memahami Abstract Model pada Odoo

Abstract model pada odoo adalah model yang tidak diubah jadi table. Pada transient model, data akan disimpan sementara di database, kemudian akan dihapus secara periodik, pada abstract model, data sama sekali tidak disimpan, karena tidak ada table-nya.

Menurut pengalaman saya, abstract model termasuk jarang digunakan. Dari source code odoo sendiri sedikit sekali module yang menggunakan jenis model ini, dibandingkan dengan concrete model dan transient model. Abstract model sebenarnya dibuat untuk di inherit oleh model lain. Jika kita baca source code odoo, sebenarnya concrete model dan transient model inherit ke abstract model.

Berikut ini adalah contoh deklarasi abstract model.

# -*- coding: utf-8 -*-

from odoo import api, fields, models, _

class ConfirmSaleTrust(models.AbstractModel):
    _name = 'sale.trust.wizard.abstract'

    partner_id = fields.Many2one('res.partner', string='Customer')

    def my_method(self):
        print('call my_method===')

Saat module selesai diinstall coba query ke abstract model diatas.

Terlihat table tidak ditemukan. Ya memang abstract model tidak dibuatkan table.

Selain untuk diinherit oleh model lain, abstract model juga bisa digunakan untuk membuat report pdf dengan data dinamis. Dinamis disini maksud saya adalah data diolah terlebih dahulu pada server sebelum dirender jadi file pdf. Misal jika report tersebut harus ambil data dari server atau website lain terlebih dahulu.

Sebagai contoh kasus kita akan membuat report pdf daftar kode pos memanfaatkan api ini. Anggap saja api ini adalah sebuah website penyedia api dengan data yang selalu berubah. Sehingga tidak mungkin untuk kita simpan di database odoo.

Pertama kita buat file xml untuk mendeklarasikan nama report dan template qweb-nya.

<?xml version="1.0" encoding="utf-8"?>
<odoo>
    <data>
        <report
            id="action_dinamyc_report_example"
            model="res.partner"
            string="Dinamyc Report Example"
            report_type="qweb-pdf"
            name="tutorial_abstract_model.dinamyc_report_example"
            file="tutorial_abstract_model.dinamyc_report_example"
        />

        <template id="dinamyc_report_example">
            <t t-call="web.html_container">
                <t t-call="web.external_layout">
                    <table class="table table-sm o_main_table">
                        <tr>
                            <th>No.</th>
                            <th>Kecamatan</th>
                            <th>Kelurahan</th>
                            <th>Kodepos</th>
                        </tr>
                        <t t-foreach="datas" t-as="data">
                            <tr>
                                <td>
                                    <span t-esc="data_index + 1"/>
                                </td>
                                <td>
                                    <span t-esc="data['kecamatan']"/>
                                </td>
                                <td>
                                    <span t-esc="data['kelurahan']"/>
                                </td>
                                <td>
                                    <span t-esc="data['kodepos']"/>
                                </td>
                            </tr>
                        </t>
                    </table>
                </t>                
            </t>
        </template>
    </data>
</odoo>

Perhatikan bagian name dan file diatas. Pastikan kedua field ini selalu sama agar lebih mudah, dan harus berbeda dengan field id

Selanjutnya buat abstract model dengan prefix report.. Kemudian buat method _get_report_values seperti dibawah ini.

# -*- coding: utf-8 -*-

from odoo import api, fields, models, _
import requests

class DinamicReport(models.AbstractModel):
    _name = 'report.tutorial_abstract_model.dinamyc_report_example'

    @api.model
    def _get_report_values(self, docids, data=None):
        # anggap saja ini adalah proses yang rumit atau ambil data dari server lain
        result = requests.get(url = 'https://kodepos-2d475.firebaseio.com/kota_kab/k69.json?print=pretty') 
        datas = result.json()

        # return data agar bisa dirender
        return {'datas': datas}

Di method _get_report_values inilah kita menyiapkan data untuk dirender jadi file pdf. Dengan menggunakan abstract method dimana data yang dirender disiapkan oleh backend secara manual, tentu kita bisa melakukan perhitungan serumit apapun terlebih dahulu.

Pada kode diatas report diletakkan di model res.partner, jadi silakan buka master customer atau vendor kemudian klik tombol print untuk melihat hasilnya.

Sebagai catatan tutorial ini ditulis dengan odoo versi 13. Download source code disini

Tulisan Serupa

Leave a Reply