如何在 OpenERP 中定义多公司感知模型

Posted

技术标签:

【中文标题】如何在 OpenERP 中定义多公司感知模型【英文标题】:How to define multi-company-aware models in OpenERP 【发布时间】:2013-01-05 22:41:12 【问题描述】:

我在 OpenERP 中定义了几个自定义对象,它们应该在多公司环境中使用。因此,每个对象定义一个“company_id”字段。这是所有设置和工作正常。只是,用户界面不是很友好,因为用户需要明确选择新对象实例应该属于的公司。

company_id 字段的设置方式如下:

...
'company_id' : fields.many2one('res.company', string='Company', selection=compute_company_select, required=True)
...


def compute_company_select(self, cr, uid, context):
    c_proxy = self.pool.get('res.company')

    user = self.pool.get('res.users').browse(cr, uid, uid, context=context)
    search = [('id', 'child_of', user.company_id.id)]
    if uid == SUPERUSER_ID:
        search = [] #superuser can assign any company

    ids = c_proxy.search(cr, uid, search, context=context)
    return [(c.id, c.name) for c in c_proxy.browse(cr, uid, ids, context=context)]

我也可以通过简单地在字段定义中定义一个域表达式来解决这个问题,使用“compute_company_select”函数中的搜索域。除了超级用户无法分配所有公司之外,如果他没有配置为可以访问所有公司。

我现在要做的是在用户创建新记录时使用用户公司预先填充 company_id 字段。而这似乎是不可能的。我发现了几种使用静态值或模块 XML 中定义的值预填充字段的可能性。但是似乎没有选项可以使用仅在运行时可用的值,即当前用户记录。

我正在使用 OpenERP 6.1。

【问题讨论】:

不过,我不同意您对标题所做的更改。因为我最初的问题是找到关于如何提供动态默认值的参考,而不是实现多公司感知对象/插件的标准方法。 【参考方案1】:

OpenERP 官方插件中的许多文档都具有类似的多公司特性,因此您应该重用相同的实现技术,这似乎与您的用例相匹配。

如果您搜索"company_id""company_id.*fields.many2one",源代码中有大量示例,例如sale 模块中的Sales Shops。

简而言之,您需要:

    company_id 字段声明为res.company 的常规many2one。默认的security record rules(定义为here)将负责仅动态显示作为用户当前公司子公司的公司。用户可以随时在首选项中将他们当前的公司更改为他们允许的公司,以便在不同的公司环境中工作。而且由于安全记录规则不适用于特殊的管理员用户,因此以管理员身份登录时始终可以选择任何公司。

    'company_id': fields.many2one('res.company', 'Company', required=False)
    

    在创建新记录时自动选择用户当前的公司作为默认值。该框架提供了一种方法来做到这一点:res.company._company_default_get()。可以定义自定义规则来为每种文档选择默认公司,但默认值将是用户当前的公司。因此,只需将此 sn-p 添加到模型的 _defaults 中即可:

    'company_id': lambda self,cr,uid,ctx: self.pool['res.company']._company_default_get(cr,uid,object='<your_model>',context=ctx)
    

    company_id 字段添加到模型的表单视图中。通常您希望将其限制在multi-company 组内,仅向真正需要它的用户展示:

    <field name="company_id" groups="base.group_multi_company"/>
    

应该就这么简单。

【讨论】:

滑稽,我正准备回答我自己的问题,因为我今天想到了你的第二点,只是我将它定义为一个全局函数并自己实现了_company_default_get中的逻辑。官方文档中是否有关于 _defaults 中引用的函数的参数的任何信息?我必须对此进行调试,以识别参数。 @RalfW:我认为_defaults 条目的签名在OpenERP Technical Memento 中有描述。当然,您也可以在source 中找到;-)

以上是关于如何在 OpenERP 中定义多公司感知模型的主要内容,如果未能解决你的问题,请参考以下文章

Odoo(OpenERP)开发实践:数据模型学习

通过电子邮件 openerp 自动发送报告

获取 OpenERP 中字段的标签名称

Openerp 7 openerp-server.conf 自定义 addons_path

如何翻译 OpenERP 模块?

18-感知机模型在经典数据集鸢尾花上的应用