Unfortunately Odoo documentation doesn’t seem to include any information about adding new configuration options to Odoo. So let’s fill in the gaps.

Defining a model

First of all, you need to define a new model inheriting from res.config.settings:

class YourSettings(models.TransientModel):
_inherit = 'res.config.settings'
_name = 'your.config.settings'

It’s a TransientModel, also known as a wizard. Do not expect it to permanently hold the values. TransientModels inherently store values on a temporary basis only. You need other means to make them permanent.

Fortunately res.config.settings makes this easy. First of all, you need to add some fields to your TransientModel - one for every setting option you want to define. Odoo comes with built-in support for four different kinds of settings. It distinguishes between them based on the field names.

“Default” settings
The value of a field named default_foo will be set as a default value for a field namedfoo on a model given as a default_model argument.

class YourSettings(models.TransientModel):
_inherit = 'res.config.settings'
_name = 'your.config.settings' default_name = fields.Char(default_model='your.other.model')

This will make the value of default_name field the global default value of a field name in model your.other.model.

“Group” settings
Boolean fields named group_foo take two arguments: group (defaults tobase.group_user) and implied_group. If the value of such field is true, the group defined in group gain all implied_group’s permissions. This is exactly the same as adding a group to implied_ids field on another group’s object (which as far as I know is also an undocumented feature). This is useful for controlling which groups of users have access to a feature.

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” settings
Boolean fields named module_foo, when enabled will trigger installation of a module named foo.

class YourSettings(models.TransientModel):
_inherit = 'res.config.settings'
_name = 'your.config.settings' # if enabled will install "spies" module
module_spies = fields.Boolean()

Other settings
By default the values of other fields will be discarded, but you change that by implementing your own means of saving them. Just define a method named set_foo(where foo is an arbitrary string). You can also set initial values of such fields using aget_default_foo method (the exact form of foo is once again irrelevant).

For example if you want to use settings to control the name and phone number of a company linked to the current user:

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

Defining a view

Then you just need to define a view for your settings. Let’s use the previous example:

<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 &amp; 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>

…and of course don’t forget to make a new entry in the settings menu:

<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

Defining custom settings in Odoo的更多相关文章

  1. salesforce 零基础学习(四十)Custom Settings简单使用

    有时候,项目中我们需要设置类似白名单的功能,即某些用户或者某种Profile的用户不走一些校验或者走一些校验,这时,使用Custom Settings功能可以很好的解决这一需求. Custom Set ...

  2. Material Design系列第六篇——Defining Custom Animations

    Defining Custom Animations //自定义动画 This lesson teaches you to //本节课知识点 Customize Touch Feedback //1. ...

  3. Custom Settings.ini 和 bootstrap.ini 配置

    [Settings]Priority=DefaultProperties=MyCustomProperty [Default] ;SkipWizard=YES 如果跳过部署向导,则即使 SkipCap ...

  4. Custom Settings.in 配置信息收集

    [Settings] Priority=Default Properties=MyCustomProperty [Default] ;是否允许部署操作系统到目标计算机 OSInstall=YES ;是 ...

  5. Creating Apps With Material Design —— Defining Custom Animations

    转载请注明 http://blog.csdn.net/eclipsexys 翻译自Developer Android,时间仓促,有翻译问题请留言指出.谢谢 定义动画 在材料设计动画让用户与您的应用程序 ...

  6. [VSCode] Custom settings

    { // UI IMPROVEMENTS —————————————————— // Part 1. "editor.minimap.enabled": false, " ...

  7. odoo配置界面设置字段默认值

    转自国外牛人博客:http://ludwiktrammer.github.io/odoo/custom-settings-odoo.html Defining custom settings in O ...

  8. 配置ubuntu 16.04.1 LTS odoo 10.0开发环境

    使用VMware Fusion 8.5.0创建ubuntu 64bit虚拟机:使用ubuntu-16.04.1-desktop-amd64.iso镜像缺省安装ubuntu,用户名odoo,密码1234 ...

  9. Access Editor Settings 访问编辑器设置

    This topic demonstrates how to access editors in a Detail View using a View Controller. This Control ...

随机推荐

  1. Intent传递类实例

    发送方: Intent intent = new Intent(); intent.setClass(mContext, HomeDetailReportActivity.class); intent ...

  2. 处理滚动条置底的JS代码

    function scrollTopToBottom(){ var seffheight =$(".consultingRecords_view").height(); $(&qu ...

  3. LayoutInflater(二)

    每一个视图的绘制过程都必须经历三个最主要的阶段,即onMeasure().onLayout()和onDraw(),下面我们逐个对这三个阶段展开进行探讨. 一. onMeasure() measure是 ...

  4. loadrunner处理HTTP重定向请求

    //place this in global.h     int HttpRetCode;  int i=0;  char depthVal[10];  char cTransactName[2000 ...

  5. BestCoder Round #83

    第一次做BC呀,本来以为会报零的,做了56分钟A了第一题 然后就没有然后了. 贴一下第一次A的代码. /* 0.组合数 1. 2016-05-14 19:56:49 */ #include <i ...

  6. JQuery学习之其他

    1.noConflict()方法:释放会$标识符的控制,这样其他也用$的脚本就可以使用它了 **全名代替简写的方法使用jQuery $.noConflict(); jQuery(document).r ...

  7. js兼容方法:获取当前样式|计算后样式 getStyle

    function getStyle(obj,attr){ if(obj.currentStyle){ //for IE return obj.currentStyle[attr]; }else{ re ...

  8. 最火的.NET开源项目

    综合类 微软企业库 微软官方出品,是为了协助开发商解决企业级应用开发过程中所面临的一系列共性的问题, 如安全(Security).日志(Logging).数据访问(Data Access).配置管理( ...

  9. node.js第一次

    随着时代的变迁,日月星辰轮回,不断的有新的事物被创造于世,作为在这个世界活着的前端工程崽的我,最近又接触了一门新手艺“node.js”.自从它2009年诞生至今,被很多前端推崇,我起步已经晚了,还好它 ...

  10. HDU5735 : Born Slippy

    考虑DP,设$f[x]$表示最后一个是$x$时的最优解,则$f[x]=\max(f[y]+w[x]\ opt\ w[y])$,其中$y$是$x$的祖先. 注意到$w[i]<2^{16}$,那么将 ...