我們在創建權限的時候,一定要在__manifest__.py
中加入,而且必須以權限大的優先排列:
'data': [
'security/groups.xml',
'security/ir.model.access.csv',
'views/library_book.xml'
],
收仙我們來創建群組,我們要先在__manifest__.py
中寫入:
'catetgory':'library',
※這個設定使的odoo會生成module_category_library
在base下。
再來新增我們groups.xml的檔案:
'data': [
'security/groups.xml',
.
.
],
開始創建 User 與 Librarian 的群組:
<odoo>
<record id='library_user' model='res.gruops'>
<field name="name">User</field>
<field name="category_id" ref="base.module_category_library"/>
<field name="implied_ids" eval="[(4,ref("base.group_user"))]"/>
</record>
<record id='library_librarian' model='res.gruops'>
<field name="name">Librarian</field>
<field name="category_id" ref="base.module_category_library"/>
<field name="implied_ids" eval="[(4,ref("library_user"))]" <!--─╥──(user+user_admin的權限) -->
<field name="users" eval="[(4,ref("base.user_admin"))]"/> <!--────╜ -->
</record>
</odoo>
通常檔案的名稱就叫做ir.model.access.csv
id,name,model_id:id,group_id:id,perm_read,perm_write,perm_create,perm_unlink
acl_book,library.book_default,model_library_book,group_library_user,1,0,0,0
acl_book_librarian,library.book_librarian,model_library_book,group_library_librarian,1,1,1,1
(0,0,{a:b}) - 創建record,並且將{a:b}關聯
(1,id,{a:b}) - 更新id值為id的record,並且將{a:b}關聯
(2,id,) - 刪除id值為id的record
(3,id,) - unlink id值為id的record
(4,id,) - link id值為id的record
(5,0,0) - 刪除所有的 link record
(6,0,[ids]) - 替換現有的 link record
範例:假設我們想限制model字段的訪問:
is_public = fields.Boolean(group="my_library.group_library_user")
private_notes = fields.Text(group="my_library.group_library_librarian")
ir.rule
當我們想要限制record的訪問,我們會創建Security/library_security.xml
,比如說user可以看自己的書
,librarian可以看到所有的書
<odoo noupdate="1">
<record id="library_book_user_rule" model="ir.rule">
<field name="name">Library: See only own books</field>
<field name="model_id" ref="model_library_book"/>
<field name="groups" eval="[(4, ref('my_library.group_library_user'))]"/>
<field name="domain_force">[('is_public','=',True)]</field>
</record>
<record id="library_book_all_rule" model="ir.rule">
<field name="name">Library: See all books</field>
<field name="model_id" ref="model_library_book"/>
<field name="groups" eval="[(4, ref('my_library.group_library_librarian'))]"/>
<field name="domain_force">[(1,'=',1)]</field>
</record>
</odoo>
當我們在畫面中,不是user權限內可以使用的功能時,我們可以使用sudo()與ensure_one():
def report_missing_book(self):
self.ensure_one()
message = "Book is missing (Reported by: %s)" % self.env.user.name
self.sudo().write({
'report_missing': message
})
※如果我們想要隱藏menu或是header的話,我們也可以使用groups:
<menuitem id='library_book_category_menu' name='book category'
parent='library_book_category_form'
groups='my_library.group_library_librarian'/>
.
<form>
<header groups="my_library.group_library_user".....>
.
.
</header>
.
.
.
</form>
.
※我們也可以透過XML中的<delete>
、<function>
來做操作:
我們可以透過<delete>
來進行刪除:
<delete model=ir.model.access search='[('id','=',ref(library.library_book_user_rule))]'>
或是透過<function>
來觸發函式:
<function model="library.book" name="book_missing" eval="[ref('book_id'),ref('book_author')]">