odoo多公司_odoo 多公司-程序员宅基地

技术标签: python  odoo  

从 odoo 13版本开始,一个用户可以同时登录多个公司。这允许用户访问来自多个公司的信息,还可以在多公司环境中创建/编辑记录。

如果处理不当,会出现一些问题。例如,可以同时登录公司 A 和 B 的用户可以在公司 A 中创建销售订单并将属于公司 B 的产品添加到其中。只有当用户从 B 公司注销时,销售订单才会出现访问错误。
那么在多公司的操作上,odoo是如何处理细节的呢?
1、公司相关字段
当一条记录可从多家公司获得时,我们必须预期将根据设置值的公司为给定字段分配不同的值。

要使同一记录的字段支持多个值,必须将其定义为属性 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

注:depends_context后的参数是上下文context中的key值
该_compute_display_info方法用depends_context(‘company’) 修饰,以确保根据当前公司 ( self.env.company) 重新计算计算域,如为uid则是当前用户。

*读取公司相关字段时,用当前公司的数据。换句话说,如果用户以 A 为主要公司登录 A 公司和 B 公司,并为 B 公司创建记录,则公司相关字段的值将是 A 公司的值。

*要读取从另一家公司而不是当前公司设置的公司相关字段的值,我们需要确保我们使用的公司是正确的。这可以通过with_company()更新当前公司来完成。

# 当前用户所属的公司为主公司 (self.env.company)
val = record.company_dependent_field

# 目前操作的公司为主公司 (company_B)
val = record.with_company(company_B).company_dependent_field
# record.with_company(company_B).env.company == company_B

注:在操作时一定要知道当前交互的公司到底是哪个:

@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)
   ...

2、多公司一致性
当一条记录通过一个字段在几家公司之间共享company_id时,我们须注意它不能通过关系字段链接到另一家公司的记录。例如,我们不希望销售订单及其发票属于不同的公司。

为确保这种多公司一致性,必须:
*将类属性设置_check_company_auto为True。
*如果模型具有 字段,则使用属性check_company设置为定义关系字段。Truecompany_id
*在每个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)

注:a.该字段company_id不得使用 定义check_company=True。

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

c.当字段上没有定义域并check_company设置为 时True,将添加一个默认域:[‘|’, '(‘company_id’, ‘=’, False), (‘company_id’, ‘=’, company_id)]
3、默认公司
当模型需要该字段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。
4、视图

<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>

5、设定安全规则
在处理跨公司共享或仅限于单个公司的记录时,我们必须注意用户无权访问属于其他公司的记录。
这是通过基于 的安全规则实现的company_ids,其中包含用户的当前公司(用户在多公司widget中检查的公司)。

<!-- 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>

其他参考文档:
https://blog.csdn.net/u012739578/article/details/121670129?ops_request_misc=%257B%2522request%255Fid%2522%253A%2522165552927016781683949249%2522%252C%2522scm%2522%253A%252220140713.130102334…%2522%257D&request_id=165552927016781683949249&biz_id=0&utm_medium=distribute.pc_search_result.none-task-blog-2allbaidu_landing_v2~default-2-121670129-null-null.142v17pc_search_result_control_group,157v15new_3&utm_term=odoo+%E5%A4%9A%E5%85%AC%E5%8F%B8&spm=1018.2226.3001.4187

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/weixin_44565926/article/details/125346106

智能推荐

后台服务守护进程神器pm2介绍及使用_pm2 执行go命令-程序员宅基地

文章浏览阅读1.4k次。linux的后台服务程序需要在后台一直运行。如果通过ssh访问临时启动的,会话一结束就直接关闭了服务。想让服务在后台一直运行且永远不挂掉,推荐后台服务守护进程神器pm2,强大且适用于各种语言的后台服务程序。_pm2 执行go命令

深度桌面操作系统架构设计-程序员宅基地

文章浏览阅读2.5k次,点赞4次,收藏23次。作者 | ManateeLazyCat 链接 |https://my.oschina.net/ManateeLazyCat/blog/831104今天就结合深度桌面操作系统给大家..._x11/xcb

亮剑:PHP,我的未来不是梦(10)-程序员宅基地

文章浏览阅读37次。1.21 工作经验都包括什么这部分就是我们前面提过的五关之一,筛选关!也就是我们靠什么来打动看我们简历的人!换句话说就是,他们希望我们具有哪些技术和能力?当然,针对不同的应聘人员,关注点也不一样!前面已经说过了,所谓的工作经验就是“应聘这个职位所必需的技术和能力”,另外,还有其他的,很容易被忽略的能力!那么这个技术和能力以及其他的能力又具体指的是什么呢? 这里只从实际的情况出发...

时序约束——set_max_delay和set_min_delay用法-程序员宅基地

文章浏览阅读6.8k次,点赞2次,收藏57次。实现约束_set_max_delay

在Linux下使用RAID(1):介绍 RAID 的级别和概念_在 linux 下使用 raid(一):介绍 raid 的级别和概念-程序员宅基地

文章浏览阅读289次。RAID 的意思是廉价磁盘冗余阵列(Redundant Array of Inexpensive Disks),但现在它被称为独立磁盘冗余阵列(Redundant Array of Independent Drives)。早先一个容量很小的磁盘都是非常昂贵的,但是现在我们可以很便宜的买到一个更大的磁盘。Raid 是一系列放在一起,成为一个逻辑卷的磁盘集合。 伦理片 http://www.dot_在 linux 下使用 raid(一):介绍 raid 的级别和概念

java计算机毕业设计课程答疑系统源程序+mysql+系统+lw文档+远程调试_一梵程序-程序员宅基地

文章浏览阅读92次。java计算机毕业设计课程答疑系统源程序+mysql+系统+lw文档+远程调试。前端技术:Layui、HTML、CSS、JS、JQuery等技术。ssm基于SSM+VUE技术的小区车辆档案车位管理系统设计与实现。springboot基于SpringBoot的自助旅游导航系统。springboot基于springboot的社会公益平台。JSP+sql图书管理系统(源程序+论文+数据库+录像)ssm+sqlserver海城同泽中学图书仓库管理系统。ssm+sqlserver长大工院竞赛系统。_一梵程序

随便推点

在Ubuntu 12.04 64 位 搭载Android4.4源码编译环境-程序员宅基地

文章浏览阅读67次。在Ubuntu 12.04 64 位 搭载Android4.4源码编译环境 一、准备工作:(1) VMare Workstation 10(2)Ubuntu12.04 64bit(3) JDK1.6(4)Android 4.4 源码(PS:...

图像数据增广_图像增广-程序员宅基地

文章浏览阅读1.2k次,点赞19次,收藏24次。本文主要介绍了图像数据的几种增广方式,其中包括随机翻转、随机裁剪和随机颜色变换等,使用时一般在训练集上综合使用以达到鲁棒效果。_图像增广

8种编程语言对比,究竟谁更好用_算法用什么语言写比较好-程序员宅基地

文章浏览阅读977次。8种编程语言对比,究竟谁更好用_算法用什么语言写比较好

数据库oracle实际使用的内存---AIX产生大量的swap反思_oracle数据库内存64,sga40,会占用swap吗-程序员宅基地

文章浏览阅读796次。来看看oracle实际使用的内存:select sum(pga_alloc_mem)/1024/1024/1024 Alloc from v$process ; +select sum(value)/1024/1024/1024 as b from v$sga + 进程本身消耗的内存。操作系统频繁使用swap,原因基本是系统内存不够用了。从数据库的内存配置来看,128G总内..._oracle数据库内存64,sga40,会占用swap吗

Matlab 仿真——直流电机速度控制(1)直流电机建模_直流电机系统建模matlab-程序员宅基地

文章浏览阅读2.2w次,点赞31次,收藏228次。Matlab 仿真——直流电机速度控制(1)直流电机建模(搬运自:https://ctms.engin.umich.edu/CTMS/index.php?example=MotorSpeed&section=SystemModeling)该系列我们学习如何对直流电机进行速度控制物理模型一个直流电机模型如下所示:为了简化讨论,假设转子和转轴都是刚体,转子受到的磁场恒定,转子受到的摩擦为粘性摩擦,即受到的摩擦力与速度成正比。假设该电机的物理参数为:(J) 转子的转动惯量 _直流电机系统建模matlab

震惊!国内常见的14款低代码平台-程序员宅基地

文章浏览阅读2.1k次。Astro轻应用(Astro Zero,简称AstroZero)是零代码和低代码应用开发平台,源于华为应用开发和数字化转型的实践,提供了云上无码化、低码化、支持多码化的应用开发模式,屏蔽了技术的复杂性,提升了企业开发的效率。开放和透明,低代码平台最大的风险是技术锁定和黑盒,作为开发者我们自己也不喜欢封闭的低代码平台,因此爱速搭重视开放性,前端方面渲染器开源了,后端方面也选择了开发人员最熟悉的传统数据库技术,没有中间层,对开发者是透明的,并且爱速搭后端不依赖任何云厂商,可以部署到任意环境。_低代码平台

推荐文章

热门文章

相关标签