odoo13之给模块添加自定义配置项

本文示例代码可查看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()
res_config_settings.py

记得在__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>
res_config_settings_view.xml

在__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']
原文地址:https://www.cnblogs.com/yifchan/p/odoo-1-5.html