Odoo – Membuat Action Server

Action Server atau lebih tepatnya ir.actions.server adalah action pada odoo yang memungkinkan bagi kita untuk memanggil kode program python dari user interface. Sebenarnya Action Server memiliki beberapa opsi, tapi menurut saya opsi yang cukup berguna pada kondisi nyata adalah Execute Python Code. Opsi ini fungsinya mirip dengan button dengan type object seperti kode dibawah ini

<button name="action_confirm" string="Confirm" class="btn-primary" type="object" />

Bedanya button diatas hanya bisa digunakan di form view. Sedangkan Action Server bisa ditempatkan pada banyak view, termasuk menuitem. Lalu kapan sebaiknya kita menggunakan Action Server ?

Gunakan Action Server jika tombol yang men-trigger action tersebut tidak bisa kita tempatkan pada Form View. Misal pada menuitem. Jika bisa kita tempatkan pada Form View lebih baik pakai button biasa saja, lebih mudah.

Yang kedua gunakan Action Server jika action yang akan kita panggil membutuhkan perhitungan atau pengecekan kondisi terlebih dahulu sebelum memberikan respon ke user atau tidak. Jika tidak gunakan Action Window dan Domain saja.

Sebagai contoh kasus, misal pada suatu perusahaan hanya memperbolehkan satu data sales target. Dimana data tersebut bisa diedit dan tidak bisa dihapus. Untuk menangani kasus ini, pada Form View kita bisa menambahkan paremeter delete=”0″ agar data tidak bisa dihapus. Juga bisa ditambahkan parameter create=”0″ agar user tidak bisa membuat data baru.

Tapi tunggu dulu, jika di Form View ditambahkan parameter create=”0″ bukannya kita tidak bisa tambah data selamanya ? Tentu saja. Oleh karena itulah kita butuh yang namanya Action Server. Jika kita menggunakan Action Server, saat user klik menu Sales Target kita bisa mengecek sudah ada data sales target atau belum, jika sudah maka ditampilkan ke user, jika belum ada ya dibuatkan data-nya lewat backend atau server, kemudian ditampilkan ke user. Sehingga user tidak bisa membuat data sales target secara bebas lewat ui dan bisa dipastikan hanya ada satu data sales target karena sudah dicek di Action Server.

Sebagai simulai kasus diatas pertama buat model sales target seperti dibawah ini

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

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

class SalesTarget(models.Model):
    _name = 'ng.sale.target'

    name = fields.Char(default='Sales Target')
    target_line_id = fields.One2many('ng.sale.target.line', 'target_id')
    

class SalesTargetLine(models.Model):
    _name = 'ng.sale.target.line'

    user_id = fields.Many2one('res.users', string='Sales Person')
    total_target = fields.Float(string='Total Target', default=0)
    target_id = fields.Many2one('ng.sale.target')


    

Kemudian buat form-nya.

<record id="ng_sale_target_form" model="ir.ui.view">
    <field name="name">Sales Target</field>
    <field name="model">ng.sale.target</field>
    <field name="arch" type="xml">
        <form string="Sales Target" create="0" delete="0">
            <sheet>
                <h2>Masukkan sales target per Sales Person</h2>
                <notebook>
                    <page string="Sales Target">
                        <field name="target_line_id">
                            <tree editable="bottom">
                                <field name="user_id" />
                                <field name="total_target" />
                            </tree>
                        </field>
                    </page>
                </notebook>
            </sheet>
        </form>
    </field>
</record>

Selanjutnya buat menu item dan action server

<!-- Action Server -->
<record id="action_open_sale_target_form" model="ir.actions.server">
    <field name="name">Sales Target</field>
    <field name="type">ir.actions.server</field>
    <field name="state">code</field>
    <!-- Nama model -->
    <field name="model_id" ref="model_ng_sale_target"/>
    <!-- Nama method yang akan dipanggil --> 
    <field name="code">action = model.open_sales_target()</field>
</record>

<!-- Menuitem di menu Sale >> Configuration -->
<menuitem name="Sales Target"
        id="menu_sale_target"
        parent="sale.menu_sale_config"
        action="action_open_sale_target_form" />

Terakhir tambahkan method dengan nama yang sama pada Action Server diatas pada model.

def open_sales_target(self):
    # cek sudah ada data sales target atau belum
    existed_data = self.env['ng.sale.target'].search([],limit=1)

    # jika belum ada buat sales target baru
    if not existed_data:
        existed_data = self.create({})        
    
    # tampilkan data sales target ke user dengan Action Window
    return {
        'type': 'ir.actions.act_window',
        'view_type': 'form',
        'view_mode': 'form',
        'res_model': 'ng.sale.target',
        'res_id': existed_data.id,
    }

Jangan lupa untuk import kode diatas pada file-file yang berhubungan kemudian install. Buka menu Sale >> Configuration >> Sales Target. Isi data secukupnya, simpan. Kemudian buka beberapa kali. Perhatikan berapa kalipun kita membuka form tersebut id-nya tidak akan berubah. Tombol Create dan Delete juga tidak ada. Artinya kita hanya punya satu data Sales Target.

Download Source Code

Tulisan Serupa

Leave a Reply

Your email address will not be published. Required fields are marked *