Tạo settings trong Odoo cho custom addon

  Nov 16, 2020      2m
   

Tut 12: Settings

Tạo settings trong Odoo cho custom addon

Odoo Tut 12: Settings

Trước khi xem bài viết này, bạn vui lòng hoàn thành hướng dẫn ở Tut 11: Tạo widget trong Odoo.

Bài viết này sẽ hướng dẫn bạn:

  • Settings trong Odoo
  • Tạo mới một settings cho custom addon trong Odoo

Môi trường lập trình:

  • Ubuntu
  • Python 3
  • Odoo 13 (released 2019)

Settings trong Odoo

Các thiết lập (settings) của các module / addon trong Odoo nằm tại: menu > Settings > General Settings. Trong mục này bạn sẽ thấy cấu hình tổng quát (General Settings) dành cho công ty và các thành phần cốt lõi Odoo (Users, Languages, Contacts, Discuss, …), và các cấu hình cụ thể của mỗi addon. Hình dưới chụp màn hình từ cấu hình addon Project:

addon project odoo settings

Tạo mới một settings trong Odoo cho custom addon

Khi viết một custom addon mới, trong trường hợp cần thiết ta có thể bổ sung settings cho custom addon của mình.

Tạo trường dữ liệu cho thiết lập

Các thiết lập (settings) của Odoo được hiện thực lưu trữ tại model res.config.settings. Việc đặt tên field trong model này cũng mang ý nghĩa nhất định.

  • default_xxx: cho phép override giá trị mặc định của field xxx trong model được mô tả bởi thuộc tính default_model="my.model.name". Field type được khai báo giống với field type mà ta sẽ override giá trị mặc định (default). Xem ví dụ bên dưới @ field default_basic_price để rõ hơn.
  • group_xxx: cho phép thêm group đặc tả tại thuộc tính implied_group vào group đặc tả tại thuộc tính group. Mặc định group sẽ là group Employee. Khai báo thiết lập này cho phép người sử dụng "kích hoạt" tính năng bằng cách phân quyền theo nhóm. Ví dụ: group_bar = fields.Boolean('Group Bar', group='base.group_user', implied_group='my.group')
  • module_xxx: cho phép cài đặt thêm module/addon xxx. Ví dụ: module_mypet_plus = fields.Boolean('Activate MyPet+')
  • Field ngoài các quy tắc trên ta có thể đặc tả thuộc tính config_parameter để Odoo lưu trữ giá trị của "settings" vào bảng config parameter. Các config parameter xem tại: Bật debug mode > Settings > Technical > System Parameters.

Tham khảo thêm chi tiết tại bài viết: https://odoo-development.readthedocs.io/en/latest/dev/py/res.config.settings.html

mypet/models/res_config_settings.py

# -*- coding: utf-8 -*-
from odoo import api, fields, models

class ResConfigSettings(models.TransientModel):
    _inherit = 'res.config.settings'

    default_basic_price = fields.Float('Default Pet\'s Basic Price', default_model='my.pet')
    mypet_is_check_duplicated_pet_name = fields.Boolean('Check Duplicated Pet Name', config_parameter='mypet.is_check_duplicated_pet_name')

Thêm vào file init:

mypet/models/__init__.py

from . import my_pet
from . import res_config_settings # <-- add this

Hiển thị thiết lập trên giao diện (view)

Ta cần phải tạo view để hiện thị thiết lập cho mypet:

  • Thừa kế view @ base.res_config_settings_view_form.
  • Dùng xpath để bổ sung view settings cho mypet.
  • Hiện thực giao diện settings của mypet bằng HTML, CSS -> sử dụng các field đã khai báo trường dữ liệu settings phía trên.

mypet/views/res_config_settings_views.xml

<?xml version="1.0" encoding="utf-8"?>
<odoo>
    <record id="res_config_settings_view_form" model="ir.ui.view">
        <field name="name">res.config.settings.view.form.inherit.mypet</field>
        <field name="model">res.config.settings</field>
        <field name="priority" eval="100"/>
        <field name="inherit_id" ref="base.res_config_settings_view_form" />
        <field name="arch" type="xml">
        <xpath expr="//div[hasclass('settings')]" position="inside">
            <div class="app_settings_block" data-string="My Pet" string="My Pet" data-key="mypet" groups="base.group_user">
                <h2>Pet Management</h2>
                <div class="row mt16 o_settings_container" id="pet_management">
                    <div id="use_collaborative_pad" class="col-12 col-lg-6 o_setting_box" title="">
                        <div class="o_setting_left_pane">
                            <field name="mypet_is_check_duplicated_pet_name"/>
                        </div>
                        <div class="o_setting_right_pane" name="mypet_is_check_duplicated_pet_name_right_pane">
                            <label for="mypet_is_check_duplicated_pet_name"/>
                            <div class="text-muted">
                                Do not allow to create pets with the same name                                                    
                            </div>
                        </div>
                    </div>
                    <div class="col-12 col-lg-6 o_setting_box">
                        <div class="o_setting_left_pane">
                        </div>
                        <div class="o_setting_right_pane">
                            <label for="default_basic_price"/><br/>
                            <field name="default_basic_price"/>
                        </div>                                    
                    </div>                            
                </div>
            </div>
        </xpath>
        </field>
    </record>
</odoo>

Thêm view phía trên vào file manifest.

mypet/__manifest__.py

# -*- coding: utf-8 -*-
{
    'name': "My pet - minhng.info",
    'summary': """My pet model""",
    'description': """Managing pet information""",
    'author': "minhng.info",
    'website': "https://minhng.info",
    'category': 'Uncategorized',
    'version': '0.1',
    'depends': [
        'product',
    ],
    'data': [
        'security/ir.model.access.csv',
        'views/templates.xml',
        'views/my_pet_views.xml',
        'wizard/batch_update.xml',        
        'views/res_config_settings_views.xml', # <-- add this
    ],
    # 'qweb': ['static/src/xml/*.xml'],
    'installable': True,
    'application': True,
}

Kết quả hiển thị sau khi thêm settings cho custom addon vào Odoo:

add custom addon settings mypet

Hiện thực logic sử dụng thiết lập

Thông tin thiết lập mypet_is_check_duplicated_pet_name mang ý nghĩa rằng nếu người dùng tick chọn, khi tạo "pet" mới hệ thống sẽ kiểm tra có trùng tên hay không, nếu có sẽ báo lỗi. Do đó, ta cần phải hiện thực custom logic cho thao tác "validate" dữ liệu này.

Minh sẽ hiện thực kiểm tra trùng tên ở model my.pet:

  • Customize/override hàm create().
  • Đọc tham số config mypet.is_check_duplicated_pet_name xem giá trị True hay False, nếu True sẽ chạy khối lệnh kiểm tra trùng tên.
  • Thực hiện kiểm tra trùng tên bằng cách query tìm kiếm trên model.

mypet/models/my_pet.py

#...
class MyPet(models.Model):
    _name = "my.pet"
    _description = "My pet model"

    #...

    @api.model
    def create(self, vals):
        is_check_duplicated_pet_name = self.env['ir.config_parameter'].sudo().get_param('mypet.is_check_duplicated_pet_name', default=False)
        if is_check_duplicated_pet_name:
            vals = [vals,] if not isinstance(vals, (tuple, list)) else vals
            for val in vals:
                pet_name = val["name"]
                pet_records = self.search([('name', '=', pet_name)])
                if pet_records:
                    raise ValidationError(_("Duplicated pet name @ %s" % pet_name))
        return super(MyPet, self).create(vals)

Kết quả khi tạo mới record trùng tên:

odoo duplicated pet name

Vậy là ta đã có thể tạo mới Settings trong Odoo dành cho custom addon bất kỳ mà bạn viết mới :).

Download Odoo Settings - Tut 12

Source code download: Tut 12: Settings in Odoo


Cài đặt Odoo:

Danh sách bài viết series Odoo:

Tham gia ngay group trên Facebook để cùng thảo luận với đồng bọn nhé: