本文示例代碼可查看github倉庫:odoo13_custom_config_item
配置項效果圖
odoo中給系統添加配置項有兩種方式,
一種是使用odoo自帶的設置,在設置中添加配置項;效果如下圖,
第二種是在模塊中自定義一個配置項管理菜單,在菜單form視圖下添加配置項;效果如下圖,
使用odoo自帶配置項
添加model
models/res_config_settings.py

from odoo import models, fields, api class ResConfigSettings(models.TransientModel): _inherit = 'res.config.settings' dingtalk_corp_id = fields.Char(string='釘釘corpId') dingtalk_app_key = fields.Char(string='釘釘AppKey') dingtalk_app_secret = fields.Char(string='釘釘AppSecret') dingtalk_agent_id = fields.Char(string='釘釘AgentId') system_ip = fields.Char(string="系統ip端口地址") def set_values(self): super(ResConfigSettings, self).set_values() params = self.env['ir.config_parameter'].sudo() params.set_param('dingtalk_corp_id', self[0].dingtalk_corp_id) params.set_param('dingtalk_app_key', self[0].dingtalk_app_key) params.set_param('dingtalk_app_secret', self[0].dingtalk_app_secret) params.set_param('dingtalk_agent_id', self[0].dingtalk_agent_id) params.set_param('system_ip', self[0].system_ip) @api.model def get_values(self): res = super(ResConfigSettings, self).get_values() params = self.env['ir.config_parameter'].sudo() res.update( dingtalk_corp_id=params.get_param('dingtalk_corp_id'), dingtalk_app_key=params.get_param('dingtalk_app_key'), dingtalk_app_secret=params.get_param('dingtalk_app_secret'), dingtalk_agent_id=params.get_param('dingtalk_agent_id'), system_ip=params.get_param('system_ip'), ) return res def sys_group(self): self.env["inherit_group"].sys_group()
記得在__init__.py中進行引用。
繼承odoo配置視圖並添加配置項
views/res_config_settings_view.xml

<?xml version="1.0" encoding="utf-8"?> <odoo> <!-- View --> <record id="res_config_settings_view_form" model="ir.ui.view"> <field name="name">res.config.settings.view.form.inherit.dingtalk_connector</field> <field name="model">res.config.settings</field> <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="釘釘" string="釘釘" data-key="dingtalk_connector" groups="base.group_system"> <h2>基本參數</h2> <div class="row mt16 o_settings_container"> <div class="col-12 col-lg-12 o_setting_box"> 基本參數是用於釘釘接口的身份認證,請務必填寫,否則模塊無法使用。其中corpId在<a href="https://open-dev.dingtalk.com/" target="_blank">釘釘開放平台</a>獲取,AppKey和AppSecret的獲取方法請參考<a href="https://open-doc.dingtalk.com/microapp/serverapi2/eev437" target="_blank">開發文檔</a> </div> <div class="col-12 col-lg-6 o_setting_box"> <div class="o_setting_right_pane"> <label for="dingtalk_corp_id"/> <div class="content-group"> <div class="mt16"> <field name="dingtalk_corp_id"/> </div> </div> </div> </div> <div class="col-12 col-lg-6 o_setting_box"> <div class="o_setting_right_pane"> <label for="dingtalk_app_key"/> <div class="content-group"> <div class="mt16"> <field name="dingtalk_app_key"/> </div> </div> </div> </div> <div class="col-12 col-lg-6 o_setting_box"> <div class="o_setting_right_pane"> <label for="dingtalk_app_secret"/> <div class="content-group"> <div class="mt16"> <field name="dingtalk_app_secret"/> </div> </div> </div> </div> <div class="col-12 col-lg-6 o_setting_box"> <div class="o_setting_right_pane"> <label for="dingtalk_agent_id"/> <div class="content-group"> <div class="mt16"> <field name="dingtalk_agent_id"/> </div> </div> </div> </div> <div class="col-12 col-lg-6 o_setting_box"> <div class="o_setting_right_pane"> <label for="system_ip"/> <div class="content-group"> <div class="mt16"> <field name="system_ip" placeholder="http://127.0.0.1:8069/"/> </div> </div> </div> </div> </div> </div> </xpath> </field> </record> </odoo>
在__mainfest__.py中引用xml文件
'data': [ 'views/res_config_settings_view.xml', ],
至此,就可以在odoo自帶設置中進行模塊配置項管理了。
配置項數據獲取
通過如下代碼可獲取配置項中的dingtalk_app_key參數,其他參數同理。
def get_dingtalk_config(self): contract_config = self.env["res.config.settings"].sudo().search([]) dingtalk_app_key = contract_config[0]['dingtalk_app_key']
在模塊中自定義配置項菜單
添加model
因為某些原因,這里采用另一個模塊的配置項。
在models/models.py文件中添加model
class AssetsConfigParameter(models.Model): _name = "assets.config.parameter" _description = "xx系統配置項" zabbix_href = fields.Char(string="zabbix api鏈接") zabbix_username = fields.Char(string="zabbix用戶名") zabbix_password = fields.Char(string="zabbix密碼")
在models/transient_models.py中添加瞬態模型
from odoo import fields, models, api, exceptions class AssetsConfigTransient(models.Model): _name = "assets.config.transient" _description = "xx系統配置項瞬態模型" zabbix_href = fields.Char(string="zabbix api鏈接") zabbix_username = fields.Char(string="zabbix用戶名") zabbix_password = fields.Char(string="zabbix密碼") @api.model def create(self, vals): configs = self.env["assets.config.parameter"].sudo().search([]) if configs: configs[0].sudo().write(vals) else: self.env["assets.config.parameter"].sudo().create(vals) return super(AssetsConfigTransient, self).create(vals) @api.model def default_get(self, fields_list): transients = super().default_get(fields_list) configs = self.env["assets.config.parameter"].sudo().search([]) if configs: transients['zabbix_href'] = configs[0]['zabbix_href'] transients['zabbix_username'] = configs[0]['zabbix_username'] transients['zabbix_password'] = configs[0]['zabbix_password'] return transients
記得在__init__.py文件中引用
添加views
在views/views.xml中添加如下內容
<odoo> <data> <!-- xx配置項模塊 開始 --> <record id="assets_config_transient_view_form" model="ir.ui.view"> <field name="name">assets.config.transient.form</field> <field name="model">assets.config.transient</field> <field name="arch" type="xml"> <form string="xx配置項"> <sheet> <group> <field name="zabbix_href"/> <field name="zabbix_username" /> <field name="zabbix_password" /> </group> </sheet> </form> </field> </record> <record id="assets_config_transient_action" model="ir.actions.act_window"> <field name="name">xx配置項瞬態</field> <field name="res_model">assets.config.transient</field> <field name="view_mode">form</field> <field name="target">current</field> </record> <!-- xx配置項模塊 結束 --> </data> </odoo>
在__mainfest__.py文中中引用views.xm文件,不做描述。
當然,還有在menus.xml中添加菜單,這里同樣不做描述。
至此,就可以在模塊菜單中設置配置項了。
配置項數據獲取
通過如下代碼可獲取配置項中的zabbix_href參數,其他參數同理。
def get_zabbix(self): configs = request.env["assets.config.parameter"].sudo().search([]) zabbix_href = configs[0]['zabbix_href']