Több vállalat irányelvei¶
Figyelem
This tutorial requires good knowledge of Odoo. Please refer to the Server framework 101 tutorial first if needed.
A 13.0 verziótól kezdve egy felhasználó egyszerre több vállalatba is bejelentkezhet. Ez lehetővé teszi a felhasználó számára, hogy hozzáférjen több vállalat információihoz, valamint hogy rekordokat hozzon létre/módosítson egy több vállalatos környezetben.
Ha nem kezelik megfelelően, ez sok inkonzisztens több vállalatos viselkedés forrása lehet. Például egy felhasználó, aki be van jelentkezve mind az A, mind a B vállalatba, létrehozhat egy értékesítési rendelést az A vállalatnál, és hozzáadhat termékeket, amelyek a B vállalathoz tartoznak. Csak akkor fordulnak elő hozzáférési hibák az értékesítési rendelésnél, amikor a felhasználó kijelentkezik a B vállalatból.
A több vállalatos viselkedések helyes kezelése érdekében az Odoo ORM több funkciót biztosít:
Vállalatfüggő mezők¶
Amikor egy rekord több vállalattól elérhető, számítanunk kell arra, hogy különböző értékek lesznek hozzárendelve egy adott mezőhöz attól függően, hogy melyik vállalattól van beállítva az érték.
Ahhoz, hogy ugyanazon rekord mezője több értéket támogasson, a company_dependent attribútummal kell definiálni, amely True értékre van állítva.
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
Megjegyzés
A _compute_display_info metódus a depends_context('company') dekorátorral van ellátva (lásd depends_context), hogy biztosítsa, hogy a számított mező újraszámításra kerüljön az aktuális vállalattól függően (self.env.company).
Amikor egy vállalatfüggő mezőt olvasunk, az aktuális vállalatot használjuk az értékének lekérésére. Más szavakkal, ha egy felhasználó be van jelentkezve az A és B vállalatokba, ahol az A a fő vállalat, és létrehoz egy rekordot a B vállalat számára, a vállalatfüggő mezők értéke az A vállalaté lesz.
Ahhoz, hogy egy másik vállalat által beállított vállalatfüggő mezők értékeit olvassuk, mint az aktuális, biztosítanunk kell, hogy a használt vállalat a megfelelő. Ezt a with_company() metódussal tehetjük meg, amely frissíti az aktuális vállalatot.
# 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
Figyelem
Bármikor, amikor olyan dolgokat számítasz/létrehozol/…, amelyek különböző vállalatokban eltérően viselkedhetnek, biztosítanod kell, hogy amit csinálsz, az a megfelelő vállalatban történik. Nem kerül sokba mindig a with_company használata, hogy elkerüljük a későbbi problémákat.
@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)
...
Többvállalati konzisztencia¶
Amikor egy rekordot több vállalat között megoszthatóvá teszünk egy company_id mező segítségével, ügyelnünk kell arra, hogy ne lehessen egy másik vállalat rekordjához kapcsolni egy relációs mezőn keresztül. Például nem szeretnénk, ha egy értékesítési rendelés és annak számlája különböző vállalatokhoz tartozna.
A többvállalati konzisztencia biztosítása érdekében:
Állítsa be a
_check_company_autoosztályattribútumotTrueértékre.Relációs mezők meghatározása
check_companyattribútummalTrueértékre állítva, ha a modelljük rendelkezikcompany_idmezővel.
Minden create() és write() műveletnél automatikus ellenőrzések indulnak el, hogy biztosítsák a rekord többvállalati konzisztenciáját.
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)
Megjegyzés
A company_id mezőt nem szabad check_company=True beállítással definiálni.
Figyelem
A check_company funkció szigorú ellenőrzést végez! Ez azt jelenti, hogy ha egy rekordnak nincs company_id-ja (azaz a mező nem kötelező), akkor nem kapcsolható olyan rekordhoz, amelynek company_id-ja be van állítva.
Megjegyzés
Amikor nincs domain meghatározva a mezőn, és a check_company True-ra van állítva, egy alapértelmezett domain kerül hozzáadásra: ['|', '('company_id', '=', False), ('company_id', '=', company_id)]
Alapértelmezett cég¶
Amikor a company_id mező kötelezővé válik egy modellen, jó gyakorlat egy alapértelmezett cég beállítása. Ez megkönnyíti a felhasználó számára a beállítási folyamatot, vagy akár garantálja annak érvényességét, amikor a cég el van rejtve a nézetből. Valóban, a cég általában el van rejtve, ha a felhasználónak nincs hozzáférése több céghez (azaz amikor a felhasználó nem tagja a base.group_multi_company csoportnak).
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)
Nézetek¶
Ahogy a fent említve van, a cég általában el van rejtve a nézetből, ha a felhasználónak nincs hozzáférése több céghez. Ezt a base.group_multi_company csoporttal értékeljük ki.
<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>
Biztonsági szabályok¶
Amikor olyan rekordokkal dolgozunk, amelyek megosztottak a cégek között vagy egyetlen cégre korlátozottak, ügyelnünk kell arra, hogy a felhasználó ne férjen hozzá más cégekhez tartozó rekordokhoz.
Ezt a company_ids alapján készült biztonsági szabályokkal érjük el, amelyek tartalmazzák a felhasználó aktuális cégeit (azokat a cégeket, amelyeket a felhasználó bejelölt a többcégű widgetben).
<!-- 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>