Odoo常规设置中的添加
Addition in General Settings of Odoo
我正在编写自定义 Odoo 模块,其中一些配置可以由用户设置。
我想在
中添加一些设置
设置 -> 配置 -> 常规设置
因此,我创建了一个 .py 包含:
from openerp.osv import fields, osv
class mymodule_configuration(osv.osv_memory):
_inherit = 'res.config.settings'
'test_field': fields.char(
string='Test Field',
required=True,
)
.XML
<record id="custom_id" model="ir.ui.view">
<field name="name">General Settings</field>
<field name="model">res.config.settings</field>
<field name="arch" type="xml">
<form string="General">
<field name="test_field"/>
</form>
</field>
</record>
它不会更改 常规设置。
如果我像这样添加参考 ID:
<field name="inherit_id" ref="base_setup.view_general_configuration"/>
然后我得到了错误
ParseError: "ValidateError
Field(s) arch
failed against a constraint: Invalid view definition
Error details:
Field module_portal
does not exist
谁能帮我解决这个问题?
您不能将字段直接添加到现有视图中。
你应该试试这个,
<record id="custom_id" model="ir.ui.view">
<field name="name">General Settings</field>
<field name="model">res.config.settings</field>
<field name="inherit_id" ref="base_setup.view_general_configuration"/>
<field name="priority" eval="50" />
<field name="arch" type="xml">
<data>
<div name="Existing div name" position="inside">
<div name="new div name">
<field name="test_field" class="oe_inline" />
<label for="test_field"/>
</div>
</div>
</data>
</field>
</record>
在 Odoo 中定义自定义设置
不幸的是,Odoo 文档似乎没有包含任何关于向 Odoo 添加新配置选项的信息。因此,让我们填补空白。
定义模型
首先,你需要定义一个继承自res.config.settings
的新模型:
class YourSettings(models.TransientModel):
_inherit = 'res.config.settings'
_name = 'your.config.settings'
是一个TransientModel
,也被称为巫师。不要指望它会永久保存这些值。 TransientModels 本质上仅临时存储值。您需要其他方法来使它们永久化。
幸运的是 res.config.settings make this easy. First of all, you need to add some fields to your
TransientModel` - 一个用于您要定义的每个设置选项。 Odoo 内置支持四种不同的设置。它根据字段名称区分它们。
“默认”设置
名为 default_foo
的字段的值将被设置为作为 default_model
参数给出的模型上名为 foo
的字段的默认值。
class YourSettings(models.TransientModel):
_inherit = 'res.config.settings'
_name = 'your.config.settings'
default_name = fields.Char(default_model='your.other.model')
这将使 default_name
字段的值成为模型 your.other.model
中字段 name
的全局默认值。
“群组”设置
名为 group_foo
的布尔字段有两个参数:group
(默认为 base.group_user
)和 implied_group
。如果该字段的值为 true,则 group 中定义的组将获得所有 implied_group
的权限。这与将一个组添加到另一个组对象的 implied_ids
字段完全相同(据我所知,这也是一个未记录的功能)。这对于控制哪些用户组可以访问某项功能很有用。
class YourSettings(models.TransientModel):
_inherit = 'res.config.settings'
_name = 'your.config.settings'
group_kill = fields.Boolean(
group='your.secret_agents',
implied_group='your.licence_to_kill'
)
“模块”设置
名为 module_foo
的布尔字段,启用后将触发名为 foo
.
的模块的安装
class YourSettings(models.TransientModel):
_inherit = 'res.config.settings'
_name = 'your.config.settings'
# if enabled will install "spies" module
module_spies = fields.Boolean()
其他设置
默认情况下,其他字段的值将被丢弃,但您可以通过实现自己的保存方式来更改它。只需定义一个名为 set_foo
的方法(其中 foo
是任意字符串)。您还可以使用 get_default_foo
方法设置此类字段的初始值(foo
的确切形式再次无关紧要)。
例如,如果您想使用设置来控制链接到当前用户的公司的名称和 phone 号码:
class YourSettings(models.TransientModel):
_inherit = 'res.config.settings'
_name = 'your.config.settings'
company_name = fields.Char()
company_phone = fields.Char()
@api.model
def get_default_company_values(self, fields):
"""
Method argument "fields" is a list of names
of all available fields.
"""
company = self.env.user.company_id
return {
'company_name': company.name,
'company_phone': company.phone,
}
@api.one
def set_company_values(self):
company = self.env.user.company_id
company.name = self.company_name
company.phone = self.company_phone
定义视图
然后您只需要为您的设置定义一个视图。让我们使用前面的例子:
<record id="your_configuration" model="ir.ui.view">
<field name="name">Your configuration</field>
<field name="model">your.config.settings</field>
<field name="arch" type="xml">
<form string="Your configuration" class="oe_form_configuration">
<header>
<button string="Save" type="object"
name="execute" class="oe_highlight"/>
or
<button string="Cancel" type="object"
name="cancel" class="oe_link"/>
</header>
<group string="Company">
<label for="id" string="Name & Phone"/>
<div>
<div>
<label for="company_name"/>
<field name="company_name"/>
</div>
<div>
<label for="company_phone"/>
<field name="company_phone"/>
</div>
</div>
</group>
</form>
</field>
</record>
<record id="your_settings_action" model="ir.actions.act_window">
<field name="name">Your configuration</field>
<field name="res_model">your.config.settings</field>
<field name="view_id" ref="your_configuration"/>
<field name="view_mode">form</field>
<field name="target">inline</field>
</record>
当然不要忘记在设置菜单中创建一个新条目:
<menuitem id="your_settings_menu" name="Your settings"
parent="base.menu_config" action="your_settings_action"/>
参考:http://ludwiktrammer.github.io/odoo/custom-settings-odoo.html
我正在编写自定义 Odoo 模块,其中一些配置可以由用户设置。
我想在
中添加一些设置
设置 -> 配置 -> 常规设置
因此,我创建了一个 .py 包含:
from openerp.osv import fields, osv
class mymodule_configuration(osv.osv_memory):
_inherit = 'res.config.settings'
'test_field': fields.char(
string='Test Field',
required=True,
)
.XML
<record id="custom_id" model="ir.ui.view">
<field name="name">General Settings</field>
<field name="model">res.config.settings</field>
<field name="arch" type="xml">
<form string="General">
<field name="test_field"/>
</form>
</field>
</record>
它不会更改 常规设置。
如果我像这样添加参考 ID:
<field name="inherit_id" ref="base_setup.view_general_configuration"/>
然后我得到了错误
ParseError: "ValidateError Field(s)
arch
failed against a constraint: Invalid view definitionError details: Field
module_portal
does not exist
谁能帮我解决这个问题?
您不能将字段直接添加到现有视图中。 你应该试试这个,
<record id="custom_id" model="ir.ui.view">
<field name="name">General Settings</field>
<field name="model">res.config.settings</field>
<field name="inherit_id" ref="base_setup.view_general_configuration"/>
<field name="priority" eval="50" />
<field name="arch" type="xml">
<data>
<div name="Existing div name" position="inside">
<div name="new div name">
<field name="test_field" class="oe_inline" />
<label for="test_field"/>
</div>
</div>
</data>
</field>
</record>
在 Odoo 中定义自定义设置
不幸的是,Odoo 文档似乎没有包含任何关于向 Odoo 添加新配置选项的信息。因此,让我们填补空白。
定义模型
首先,你需要定义一个继承自res.config.settings
的新模型:
class YourSettings(models.TransientModel):
_inherit = 'res.config.settings'
_name = 'your.config.settings'
是一个TransientModel
,也被称为巫师。不要指望它会永久保存这些值。 TransientModels 本质上仅临时存储值。您需要其他方法来使它们永久化。
幸运的是 res.config.settings make this easy. First of all, you need to add some fields to your
TransientModel` - 一个用于您要定义的每个设置选项。 Odoo 内置支持四种不同的设置。它根据字段名称区分它们。
“默认”设置
名为 default_foo
的字段的值将被设置为作为 default_model
参数给出的模型上名为 foo
的字段的默认值。
class YourSettings(models.TransientModel):
_inherit = 'res.config.settings'
_name = 'your.config.settings'
default_name = fields.Char(default_model='your.other.model')
这将使 default_name
字段的值成为模型 your.other.model
中字段 name
的全局默认值。
“群组”设置
名为 group_foo
的布尔字段有两个参数:group
(默认为 base.group_user
)和 implied_group
。如果该字段的值为 true,则 group 中定义的组将获得所有 implied_group
的权限。这与将一个组添加到另一个组对象的 implied_ids
字段完全相同(据我所知,这也是一个未记录的功能)。这对于控制哪些用户组可以访问某项功能很有用。
class YourSettings(models.TransientModel):
_inherit = 'res.config.settings'
_name = 'your.config.settings'
group_kill = fields.Boolean(
group='your.secret_agents',
implied_group='your.licence_to_kill'
)
“模块”设置
名为 module_foo
的布尔字段,启用后将触发名为 foo
.
class YourSettings(models.TransientModel):
_inherit = 'res.config.settings'
_name = 'your.config.settings'
# if enabled will install "spies" module
module_spies = fields.Boolean()
其他设置
默认情况下,其他字段的值将被丢弃,但您可以通过实现自己的保存方式来更改它。只需定义一个名为 set_foo
的方法(其中 foo
是任意字符串)。您还可以使用 get_default_foo
方法设置此类字段的初始值(foo
的确切形式再次无关紧要)。
例如,如果您想使用设置来控制链接到当前用户的公司的名称和 phone 号码:
class YourSettings(models.TransientModel):
_inherit = 'res.config.settings'
_name = 'your.config.settings'
company_name = fields.Char()
company_phone = fields.Char()
@api.model
def get_default_company_values(self, fields):
"""
Method argument "fields" is a list of names
of all available fields.
"""
company = self.env.user.company_id
return {
'company_name': company.name,
'company_phone': company.phone,
}
@api.one
def set_company_values(self):
company = self.env.user.company_id
company.name = self.company_name
company.phone = self.company_phone
定义视图
然后您只需要为您的设置定义一个视图。让我们使用前面的例子:
<record id="your_configuration" model="ir.ui.view">
<field name="name">Your configuration</field>
<field name="model">your.config.settings</field>
<field name="arch" type="xml">
<form string="Your configuration" class="oe_form_configuration">
<header>
<button string="Save" type="object"
name="execute" class="oe_highlight"/>
or
<button string="Cancel" type="object"
name="cancel" class="oe_link"/>
</header>
<group string="Company">
<label for="id" string="Name & Phone"/>
<div>
<div>
<label for="company_name"/>
<field name="company_name"/>
</div>
<div>
<label for="company_phone"/>
<field name="company_phone"/>
</div>
</div>
</group>
</form>
</field>
</record>
<record id="your_settings_action" model="ir.actions.act_window">
<field name="name">Your configuration</field>
<field name="res_model">your.config.settings</field>
<field name="view_id" ref="your_configuration"/>
<field name="view_mode">form</field>
<field name="target">inline</field>
</record>
当然不要忘记在设置菜单中创建一个新条目:
<menuitem id="your_settings_menu" name="Your settings"
parent="base.menu_config" action="your_settings_action"/>
参考:http://ludwiktrammer.github.io/odoo/custom-settings-odoo.html