在實際的培訓和實施過程中,我們發現客戶往往會提出很多記錄級別的訪問規則要求。最經典的就是:“我希望銷售員只能看到他自己創建的客戶,而其經理則可以看到所有業務員創建的客戶信息”, 本文就是以這個需求為藍本來介紹如何使用OpenERP的“記錄規則”來定制記錄級別的訪問控制。
我們在做好了以上基本設置以後,可以嘗試用前面定義的三個不同用戶分別登錄系統,並且為客戶設置不同的銷售員,在目前情況下,三個用戶看到的客戶記錄完全一樣,這是因為我們還沒有為客戶對象設置需要的記錄規則
創建記錄規則,需要有“技術特性”(Technical Features)權限,在做以下操作前先給予Administrator 用戶該權限。並刷新頁面。
點擊設置->技術->安全設定->記錄規則 菜單項,對於本文之要求我們實際只需創建兩條記錄規則分別適用‘See Own Leads”組和”See All Leads”組,這樣銷售和業務員登錄後就可以按要求看到不同的客戶信息了。
以下是設置好的結果,大家可以利用之前測試環境來驗證以下的設置。我們在後面對這個設置做一些解釋:
See Own Leads組的記錄規則
Sell All Leads 組的記錄規則
我們首先來看適用於“查看自己線索”(See Own Leads)組的記錄規則中的Domain設置:
[
'|'
,
'|'
,
'|'
, (
'user_id'
,
'='
,user.
id
),
'&'
, (
'user_id'
,
'='
,
False
),(
'parent_id.user_id'
,
'='
, user.
id
),
'&'
, (
'user_id'
,
'='
,
False
), (
'parent_id.user_id'
,
'='
,
False
),
'&'
, (
'user_id'
,
'='
,
False
), (
'parent_id'
,
'='
,
False
)]
Domain實際上就是一個或多個過濾條件的組合,對於上例,實際上四條過濾條件的並集(求或),即:
user_id == user.id ?
這種情況最容易理解,左邊的user_id是客戶(合作伙伴)對象上的“銷售員”字段的內部名稱,右邊的user表示當前登錄用戶。整個記錄表示,客戶的銷售員的id如果與登錄用戶的id相同即滿足條件。這個條件的滿足,表示業務員能看到屬於自己的客戶(即客戶上的銷售員指定為自己的客戶)
或者
user_id == False 並且 parent_id.user_id == user.id ?
此條規則以及下面兩條規則,都是考慮了因為有客戶可以有“公司”和下屬“聯系人”兩層關系的情況。此條規則表示:當前的客戶的銷售員未定義(False),但是其父親parent_id(即該聯系人所屬公司)上的銷售員與當前登錄用戶相符時成立。
或者
user_id == False 並且 parent_id.user_id == False ?
當當前訪問的聯系人及其所屬公司都沒有設置銷售員信息時,當前用戶可訪問該記錄
或者
user_id == False 並且 parent_id == False?
當當前訪問的公司(parent_id == False),沒有設置銷售員時,當前用戶可訪問該記錄
對於“訪問所有線索”組,我們只有一條簡單的記錄:
[(
1
,
'='
,
1
)]
這是因為,“訪問所有線索”組繼承自“訪問自己線索”組,默認適用於“訪問自己線索”組的記錄規則也適用於“訪問所有線索”組,以上的記錄規則永遠為真,從而繞過了”訪問自己線索“組的過濾條件。
好了,我們已經了解如何通過記錄規則來實現“業務員能看到自己的客戶,而經理可以看到全部客戶”這樣的簡單要求。事實上,我們還可以利用記錄規則中對於“創建”,“讀取”, “修改”,“刪除”權限的控制來實現,例如“銷售員可以編輯修改自己客戶,但對不屬於自己的客戶僅有查看權限,經理可以查看,編輯,刪除所有的客戶“這樣的類似的稍微變化的需求。
原文地址:http://cn.openerp.cn/record_rule/
*