在OpenERP V7視圖(ir.ui.view)多了一個非常有用的字段(groups_id)
'groups_id'
: fields.many2many(
'res.groups'
,
'ir_ui_view_group_rel'
,
'view_id'
,
'group_id'
, string
=
'Groups'
,
help
=
"If this field
is
empty, the view applies to
all
users.
Otherwise, the view applies to the users of those groups only."),
在OpenERP 7.0之前我們訪問的視圖一般是這樣組成的:
1.會根據你的菜單動作所綁定的view_id來直接找到所要呈現的視圖,如果沒指定或者沒找到就會選取你將要訪問的model的優先級最高的視圖。
2.找到基礎的視圖後,系統會找出所有繼承這個視圖的視圖,把他們按照優先級疊加在一起。
3.最後視圖渲染呈現到浏覽器。
也就是說在舊版本裡面不同用戶看到同一個界面都是同一組視圖疊加形成的。
在添加了這個groups_id字段後,視圖的疊加方式將要改變。相信各位看到這裡也差不多能明白了。對的!現在不同用戶登陸,疊加的視圖會根據你當前用戶組來選擇。不同用戶看到的視圖可以完全不一樣。情況如下圖:
詳細代碼可以看。
#addons/base/ir/ir_ui_view.py
def
get_inheriting_views_arch(
self
, cr, uid, view_id, model, context
=
None
):
.....
# filter views based on user groups
return
[(view.arch, view.
id
)
for
view
in
self
.browse(cr,
1
, view_ids, context)
if
not
(view.groups_id
and
user_groups.isdisjoint(view.groups_id))]
1.某些字段對於某些權限組的人是可寫入,但是其他權限組的人是只讀。
例如我新建一個視圖view1繼承產品視圖view修改成本價為只 讀,view2修改成本價可寫,groups_id 是采購經理,那麼沒有采購經理權限的人打開視圖看到的是成本價只讀(view+view1),采購經理看到的是可寫的(view+view1+view2)。
2.具有某些權限組的人看到的視圖更豐富。(例如:OpenERP裡面銷售訂單行editable的設置就是通過groups_id來實現)
<</code>record
id
=
"view_order_form_editable_list"
model
=
"ir.ui.view"
>
<</code>field
name
=
"name"
>sale.order.form.editable.list</</code>field
>
<</code>field
name
=
"model"
>sale.order</</code>field
>
<</code>field
name
=
"inherit_id"
ref
=
"sale.view_order_form"
/>
<</code>field
name
=
"groups_id"
eval
=
"[(6, 0, [ref('product.group_uos'), ref('product.group_stock_packaging'), ref('sale.group_mrp_properties')])]"
/>
<</code>field
name
=
"arch"
type
=
"xml"
>
<</code>xpath
expr
=
"//field[@name='order_line']/tree"
position
=
"attributes"
>
<</code>attribute
name
=
"editable"
/>
</</code>xpath
>
</</code>field
>
</</code>record
>
這裡就是上面說的2裡面的實現方式,這裡為視圖view_order_form_editable_list定義了groups_id,我們來一起分析下。
這樣定義對於不同的用戶組呈現不同組合的視圖這種需求是非常有用。但是它並不是完整的權限配置,因為這裡的權限設置都是對於視圖上的,用戶還可以通過別的方式來直接或者間接得到數據(例如:導入、導出,XML-RPC…)。所以要完善的權限配置我們還必須配合各種權限規則來組合使用: