マルチ企業ガイドライン¶
警告
このチュートリアルでは、Odoo の知識が必要です。必要に応じて、 :doc:`../tutorials/server_framework_101`チュートリアルを最初に参照してください。
バージョン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社にログインし、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
で定義してはいけません。
警告
check_company
機能は厳密なチェックを行います!レコードに company_id
がない場合 (i. 、フィールドは必須ではありません)。company_id
が設定されているレコードにリンクすることはできません。
注釈
フィールドにドメインが定義されておらず、check_company
が True
に設定されている場合 デフォルトドメインが追加されました: ['|', '('company_id', '=', False), ('company_id', '=', company_id)]
既定の企業¶
モデルで company_id
フィールドが必要な場合は、デフォルトの会社を設定することをお勧めします。 ユーザーのセットアップフローを緩和したり、会社が見えなくなったときにその有効性を保証したりします。 確かに、ユーザーが複数の企業にアクセスできない場合、会社は通常隠されています (i. 、ユーザーが 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)
ビュー¶
above <howto/company/default_company>`で述べたように。 ユーザーが複数の会社にアクセスできない場合は、通常、会社は表示されません。 これはグループ `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>