宜兴通达竭诚为您服务。

通达科技 - 宜兴电脑维护及IT服务外包服务商

多公司指南
  • 上传者: Administrator
  • 上传时间:2023年12月06日 08时04分01秒
摘要:
警告 本教程需要对Odoo有良好的了解。如有需要,请先参考  开始 [1]  教程。 从13.0版本开始,用户可以同时登录多个公司。这使得用户可以访问多个公司的信息,同时在多公司环境中创建/编辑记录。 如果没有正确管理,它可能是许多不一致的多公司行为的源头。例如,一个同时登录到公司A和公司B的用户可 ......
正文 相关文章 请喝咖啡

     警告

    本教程需要对Odoo有良好的了解。如有需要,请先参考 开始 教程。

    从13.0版本开始,用户可以同时登录多个公司。这使得用户可以访问多个公司的信息,同时在多公司环境中创建/编辑记录。

    如果没有正确管理,它可能是许多不一致的多公司行为的源头。例如,一个同时登录到公司A和公司B的用户可以在公司A创建一个销售订单,并将属于公司B的产品添加到其中。只有当用户从公司B退出登录时,销售订单才会出现访问错误。

    为了正确管理多公司行为,Odoo的ORM提供了多种功能:

    与公司相关的字段

    当一条记录可以从多个公司获取时,我们必须预期根据设置值的公司不同,给定字段将分配不同的值。

    对于同一记录的字段要支持多个值,必须使用属性 company_dependent 设置为 True 进行定义。

    from odoo import api, fields, models
    
    class Record(models.Model):
        _name = 'record.public'
    
        info = fields.Text()
        company_info = fields.Text(company_dependent=True)
        display_info = fields.Text(string='Infos', compute='_compute_display_info')
    
        @api.depends_context('company')
        def _compute_display_info(self):
            for record in self:
                record.display_info = record.info + record.company_info
    

     注解

    方法 _compute_display_info 被修饰为 depends_context('company') (参见 depends_context),以确保计算字段根据当前公司 (self.env.company) 重新计算。

    当读取一个依赖于公司的字段时,当前公司将被用来检索其值。换句话说,如果用户登录到公司A和B,并将A设置为主要公司,然后为公司B创建一条记录,那么公司依赖字段的值将是公司A的值。

    要读取由其他公司设置的与公司相关的字段的值,而不是当前公司,我们需要确保我们使用的公司是正确的。这可以通过 with_company() 来实现,它会更新当前公司。

    # Accessed as the main company (self.env.company)
    val = record.company_dependent_field
    
    # Accessed as the desired company (company_B)
    val = record.with_company(company_B).company_dependent_field
    # record.with_company(company_B).env.company == company_B
    

     警告

    无论您计算/创建/…的事情在不同的公司中可能会有不同的行为,您都应该确保您所做的事情是在正确的公司中完成的。始终使用 with_company 来避免以后出现问题并不会花费太多。

    @api.onchange('field_name')
    def _onchange_field_name(self):
     self = self.with_company(self.company_id)
     ...
    
    @api.depends('field_2')
    def _compute_field_3(self):
     for record in self:
       record = record.with_company(record.company_id)
       ...
    

    多公司一致性

    当一条记录通过 company_id 字段在多个公司之间共享时,我们必须确保它不能通过关系字段与另一个公司的记录关联。例如,我们不希望销售订单和其发票属于不同的公司。

    为确保多公司的一致性,您必须:

    • 将类属性 _check_company_auto 设置为 True

    • 如果模型具有 company_id 字段,请使用属性 check_company 设置为 True 来定义关系字段。

    在每次 create() 和 write() 操作中,将会触发自动检查以确保记录的多公司一致性。

    from odoo import fields, models
    
    class Record(models.Model):
        _name = 'record.shareable'
        _check_company_auto = True
    
        company_id = fields.Many2one('res.company')
        other_record_id = fields.Many2one('other.record', check_company=True)
    

     注解

    字段 company_id 不应该使用 check_company=True 来定义。

    Model._check_company(fnames=None)[源代码]

    检查给定字段名称的值的公司。

    参数

    fnames (list) – 要检查的关系字段的名称

    引发

    UserError – 如果任何字段的值的 company_id 不在 [False, self.company_id] (或者 self 如果是 res_company )。

    对于 res_users 关联字段,验证记录的公司是否在 company_ids 字段中。

    用户A是主公司,可以访问公司A和B,但是可能会被分配或链接到公司B的记录中。

     警告

    “check_company” 功能执行严格检查!这意味着如果一条记录没有 company_id`(即,该字段不是必需的),它不能链接到一个 `company_id 已设置的记录。

     注解

    当字段上未定义域并且 check_company 设置为 True 时,将添加默认域: ['|', '('company_id', '=', False), ('company_id', '=', company_id)]

    默认公司

    当模型上的字段 company_id 被设置为必填时,一个好的实践是设置一个默认公司。这样可以简化用户的设置流程,甚至在公司被隐藏时保证其有效性。实际上,如果用户没有访问多个公司的权限(即用户没有 base.group_multi_company 组),通常会隐藏公司。

    from odoo import api, fields, models
    
    class Record(models.Model):
        _name = 'record.restricted'
        _check_company_auto = True
    
        company_id = fields.Many2one(
            'res.company', required=True, default=lambda self: self.env.company
        )
        other_record_id = fields.Many2one('other.record', check_company=True)
    

    视图

    如上所述,如果用户没有访问多个公司的权限,通常情况下公司是隐藏的。这是通过 base.group_multi_company 组进行评估的。

    <record model="ir.ui.view" id="record_form_view">
        <field name="name">record.restricted.form</field>
        <field name="model">record.restricted</field>
        <field name="arch" type="xml">
            <form>
                <sheet>
                    <group>
                        <group>
                            <field name="company_id" groups="base.group_multi_company"/>
                            <field name="other_record_id"/>
                        </group>
                    </group>
                </sheet>
            </form>
        </field>
    </record>
    

    安全规则

    在处理跨公司共享或限制于单个公司的记录时,我们必须注意用户不能访问属于其他公司的记录。

    这是通过基于 company_ids 的安全规则实现的,其中包含用户的当前公司(用户在多公司小部件中选择的公司)。

    <!-- Shareable Records -->
    <record model="ir.rule" id="record_shared_company_rule">
        <field name="name">Shared Record: multi-company</field>
        <field name="model_id" ref="model_record_shared"/>
        <field name="global" eval="True"/>
        <field name="domain_force">
            ['|', ('company_id', '=', False), ('company_id', 'in', company_ids)]
        </field>
    </record>
    
    <!-- Company-restricted Records -->
    <record model="ir.rule" id="record_restricted_company_rule">
        <field name="name">Restricted Record: multi-company</field>
        <field name="model_id" ref="model_record_restricted"/>
        <field name="global" eval="True"/>
        <field name="domain_force">
            [('company_id', 'in', company_ids)]
        </field>
    </record>
    本文章从网上收集,如有侵权请联系tderp@tderp.com删除
  • 微信扫一扫,一分也是爱:
  • 微信

服务原则及地区范围

宜兴通达网络科技有限公司,地处中国宜兴环科园内,是一家高新技术企业。公司在企业网络维护和企业信息化建设与咨询方面,有10多年经验。

我公司愿与客户一道,力求彻底解决客户问题!
我们不是在给企业提供“头痛医头、脚痛医脚”的暂时解决方案,而是在部署根本性安全与稳定服务!!
我们愿携手客户,建立企业IT规划;杜绝随意安装系统、软件等操作;力求共同维护有序、安全、稳定的网络办公环境!!!
IT服务,服务是根本,客户是上帝;我们提供快速响应、快速上门、快速排查,提供优质高效的服务!!!!

通达科技提供全国范围内的服务,服务形式包括远程协助、电话咨询、电子邮件咨询、传真咨询、问答平台的问题解决等。

宜兴地区提供上门服务:

  • 市区服务:宜城街道、城北街道(屺亭街道)、新街街道、新庄街道、环科园、渚桥开发区
  • 市郊服务:张渚镇、西渚镇、太华镇、徐舍镇、官林镇、杨巷镇、新建镇、和桥镇、高塍镇、万石镇、周铁镇、芳桥镇、丁蜀镇、湖父镇。
  • 联系电话:189-21-343434
  • 在线沟通: