程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> 更多編程語言 >> Python >> 記錄規則 – 銷售只能看到自己的客戶,經理可以看到全部

記錄規則 – 銷售只能看到自己的客戶,經理可以看到全部

編輯:Python

OpenERP中的權限管理有四個層次:

  • 菜單級別: 即,不屬於指定菜單所包含組的用戶看不到該菜單。不安全,只是隱藏菜單,若用戶知道菜單ID,仍然可以通過指定URL訪問
  • 對象級別: 即,對某個對象是否有‘創建,讀取,修改,刪除“的權限。OE中的對象可以簡單理解為表對象,比如“客戶”,“產品”,“銷售訂單”等都是對象
  • 記錄級別: 即,對對象表中的數據的訪問權限。比如同樣訪問“客戶”對象,業務員只能對自己創建的客戶有訪問的權限,而經理可以訪問其所轄的業務員的所有“客戶”對象,這裡的訪問也可以進一步明細到“創建,讀取,修改,刪除”的權限
  • 字段級別: 即,一個對象或表上的某些字段的訪問權限。比如產品的成本字段只有經理有讀權限,比如訂單上的單價字段只有經理才有修改的權限等。

在實際的培訓和實施過程中,我們發現客戶往往會提出很多記錄級別的訪問規則要求。最經典的就是:“我希望銷售員只能看到他自己創建的客戶,而其經理則可以看到所有業務員創建的客戶信息”, 本文就是以這個需求為藍本來介紹如何使用OpenERP的“記錄規則”來定制記錄級別的訪問控制。

 

測試環境創建:

  • 創建三個用戶,分別是manager, sale1, sale2。 manager的“銷售”應用的訪問權限為:查看所有線索; 而sale1和sale2兩個業務員的訪問權限為:查看自己的線索, 這兩個不同的權限實際上對應兩個不同的:See Own Leads (group_sale_salesman), 和 See All Leads (group_sale_salesman_all_leads)

    OpenERP access control
  • 創建兩個公司,分別為Company ABC 和Company XYZ, 每個公司下分別有兩個聯系人ABC Contact 1, ABC Contact 2, XYZ Contact 1, XYZ Contact 2
  • OpenERP Customer
    OpenERP object CustomerSelection_014
  • 注意在創建的公司或聯系人表單的“銷售與采購”頁簽中有銷售員選項,我們就是用這個字段(user_id)來過濾記錄,該字段的默認值為空。若希望改變該字段默認值為創建用戶的ID,只需改變一行代碼即可實現,以後再做介紹。

記錄規則設置:

我們在做好了以上基本設置以後,可以嘗試用前面定義的三個不同用戶分別登錄系統,並且為客戶設置不同的銷售員,在目前情況下,三個用戶看到的客戶記錄完全一樣,這是因為我們還沒有為客戶對象設置需要的記錄規則

創建記錄規則,需要有“技術特性”(Technical Features)權限,在做以下操作前先給予Administrator 用戶該權限。並刷新頁面。

點擊設置->技術->安全設定->記錄規則 菜單項,對於本文之要求我們實際只需創建兩條記錄規則分別適用‘See Own Leads”組和”See All Leads”組,這樣銷售和業務員登錄後就可以按要求看到不同的客戶信息了。

以下是設置好的結果,大家可以利用之前測試環境來驗證以下的設置。我們在後面對這個設置做一些解釋:

See Own Leads組的記錄規則

See_Own_Partners

Sell All Leads 組的記錄規則

See_All_Partners

我們首先來看適用於“查看自己線索”(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)]

這是因為,“訪問所有線索”組繼承自“訪問自己線索”組,默認適用於“訪問自己線索”組的記錄規則也適用於“訪問所有線索”組,以上的記錄規則永遠為真,從而繞過了”訪問自己線索“組的過濾條件。


openerp group inheritance

好了,我們已經了解如何通過記錄規則來實現“業務員能看到自己的客戶,而經理可以看到全部客戶”這樣的簡單要求。事實上,我們還可以利用記錄規則中對於“創建”,“讀取”, “修改”,“刪除”權限的控制來實現,例如“銷售員可以編輯修改自己客戶,但對不屬於自己的客戶僅有查看權限,經理可以查看,編輯,刪除所有的客戶“這樣的類似的稍微變化的需求。

原文地址:http://cn.openerp.cn/record_rule/

*
  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved