Tạo settings trong Odoo cho custom addon
Tut 12: Settings
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:
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 @ fielddefault_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ínhgroup
. Mặc địnhgroup
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:
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:
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
Bài viết tiếp theo: Tut 13: Thêm button cho list/tree view trong Odoo
- Khóa học lập trình Odoo TP.HCM: Thông tin và đăng ký khóa học
- Khảo sát nhu cầu học nghiệp vụ Odoo Offline @ HCM & đăng ký sớm: https://forms.gle/auBXLNbfuNqhJSbj8
Cài đặt Odoo:
- Docker Compose for Odoo 10
- Docker Compose for Odoo 11
- Docker Compose for Odoo 12
- Docker Compose for Odoo 13
- Docker Compose for Odoo 14
- Docker Compose for Odoo 15
- Docker Compose for Odoo 16
- Docker Compose for Odoo 17
- Docker Compose for Odoo 18
Danh sách bài viết series Odoo:
- Tut 0: Học lập trình Odoo - tutorials
- Tut 1: Odoo là gì?
- Tut 2: Hướng dẫn cài đặt Odoo version 10, 11, 12, 13, 14, 15, 16, 17, 18
- Tut 3: Tạo model trong Odoo
- Tut 4: View trong Odoo
- Tut 5: Controller trong Odoo
- Tut 6: Thừa kế model trong Odoo
- Tut 7: Thừa kế view trong Odoo
- Tut 8: Thừa kế controller trong Odoo
- Tut 9: API trong Odoo - XML-RPC
- Tut 10: Hiện thực wizard trong Odoo
- Tut 11: Tạo widget trong Odoo
- Tut 12: Tạo settings trong Odoo cho custom addon
- Tut 13: Thêm button cho list/tree view trong Odoo
- Tut 14: Search, Filter, Group By trong Odoo
- Tut 15: Kết nối PostgreSQL database của Odoo bằng câu lệnh
- Tut 16: Kết nối pgAdmin vào PostgreSQL database của Odoo
- Tut 17: Tra cứu mã nguồn để lập trình Odoo
Tham gia ngay group trên Facebook để cùng thảo luận với đồng bọn nhé:
- Fanpage Minh: https://www.facebook.com/minhng.info
- Khám phá Odoo: https://www.facebook.com/groups/odoo-dev
Khám phá Odoo