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

时间:2013-01-22 16:12:40

标签: python forms default-value openerp

我在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 个答案:

答案 0 :(得分:4)

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

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

简而言之,您需要:

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

    'company_id': fields.many2one('res.company', 'Company', required=False)
    
  2. 创建新记录时,自动选择用户当前公司作为默认值。该框架提供了一种完全相同的方法:res.company._company_default_get()。可以为每种文档选择默认公司定义自定义规则,但默认值为用户当前公司。因此,只需将此代码段添加到模型的_defaults

    即可
    'company_id': lambda self,cr,uid,ctx: self.pool['res.company']._company_default_get(cr,uid,object='<your_model>',context=ctx)
    
  3. company_id字段添加到模型的表单视图中。通常您希望将其限制为multi-company组,仅向实际需要它的用户显示:

    <field name="company_id" groups="base.group_multi_company"/>
    
  4. 应该就这么简单。