odoo base_security.xml
-
<record model="res.groups" id="group_erp_manager"> <field name="name">Access Rights</field> </record> <record model="res.groups" id="group_system"> <field name="name">Settings</field> <field name="implied_ids" eval="[(4, ref('group_erp_manager'))]"/> <field name="users" eval="[(4, ref('base.user_root'))]"/> </record> <record model="res.groups" id="group_user"> <field name="name">Employee</field> </record> <record id="default_user" model="res.users"> <field name="groups_id" eval="[(4,ref('base.group_user'))]"/> </record> <record model="res.groups" id="group_multi_company"> <field name="name">Multi Companies</field> </record> <record model="res.groups" id="group_multi_currency"> <field name="name">Multi Currencies</field> </record> <record model="res.groups" id="group_no_one"> <field name="name">Technical Features</field> </record> <record model="res.groups" id="group_user"> <field name="implied_ids" eval="[(4, ref('group_no_one'))]"/> <field name="users" eval="[(4, ref('base.user_root'))]"/> </record> <record model="res.groups" id="group_partner_manager"> <field name="name">Contact Creation</field> </record> <record id="default_user" model="res.users"> <field name="groups_id" eval="[(4,ref('base.group_partner_manager'))]"/> </record>
上面是odoo中关于用户组的源码,有几个问题请教各位:
- xml id="default_user",有两个,分别是
<record id="default_user" model="res.users"> <field name="groups_id" eval="[(4,ref('base.group_user'))]"/> </record> <record id="default_user" model="res.users"> <field name="groups_id" eval="[(4,ref('base.group_partner_manager'))]"/> </record>
问题是:这样的话,default_user到底是哪个起作用?
id="group_partner_manager"
的Contact Creation
这个组什么作用,如果default_user有这个组的权限,那就crud权限都有,会跟自定义模型中定义的crud冲突的?2.
id="group_no_one"
的Technical Features
这个是有什么作用的?3.我想重写
default_user
这个用户组,是所有的default_user
只有read的权限,这样写是错的(如下),什么原因呢?或者其他解决办法吗?<record model="res.groups" id="sps_group_partner_manager"> <field name="name">SPS Contact Creation</field> <field name="category_id" ref="module_category_extra"/> <field name="implied_ids" eval="[(4, ref('base.default_user'))]"/> <field name="users" eval="[(4, ref('base.user_root'))]"/> <field name="perm_read" eval="True"/> <field name="perm_write" eval="False"/> <field name="perm_create" eval="False"/> <field name="perm_unlink" eval="False"/> </record>
各路大神给指导下,先行谢谢了.
-
1.这样的话,default_user到底是哪个起作用?id="group_partner_manager"的Contact Creation这个组什么作用,如果default_user有这个组的权限,那就crud权限都有,会跟自定义模型中定义的crud冲突的?
都起作用了,xml会按顺序执行,分别给
default_user
添加了权限组'base.group_user
,base.group_partner_manager
,group_partner_manager
默认的权限是可以创建业务伙伴,至于会不会跟你自定义模型的CRUD冲突,那就要看自定义模型怎么定义有关系了2.id="group_no_one"的Technical Features这个是有什么作用的?
一般都是系统技术配置菜单,默认是隐藏起来,一般操作人员不需要访问。
3.我想重写default_user这个用户组,是所有的default_user只有read的权限,这样写是错的(如下),什么原因呢?或者其他解决办法吗?
default_user
是用户,不是用户组,你这里的<field name="implied_ids" eval="[(4, ref('base.default_user'))]"/>
应该会有报错,至于你问的问题要修改系统自带的用户组,只要xml_id是系统原来就有的,更新模块的时候就会把你的修改更新到系统里面,例如:<record id="系统模块名.要修改的XML-ID" model="模型名"> <field name="name">新名字</field> </record>
附
default_user
定义<!-- Default user with full access rights for newly created users --> <record id="default_user" model="res.users"> <field name="name">default user</field> <field name="login">default</field> <field name="active" eval="False"/> </record>
-
@joshua
问题1.group_partner_manager
默认的权限是可以创建业务伙伴,这个没用到,不是很理解.
我用到是:这个组默认的read,write,create,unlink
的权限都是True
.至于会跟我自定义模型的CRUD冲突,是因为:比如我定义的模型中有些没有给create
权限的,由于default user
默认属于group_partner_manager
这个组,最后的实际的结果是我定义的没有create
权限的用户反而也有create
权限了.
所以,我理解的是,odoo系统中自定义的用户的权限应该是default user
跟自定义user的权限的相加.新考虑的问题:如果是重写系统默认的用户或者用户组,是不是先要继承原先的视图,跟xml继承一样.
基于以上考虑,做了如下尝试:
因为default user
默认属于group_partner_manager
组,我现在只是不想admin创建的用户,有这个组的权限.那么我是重写defult user``还是重写
group_partner_manager```组的权限比较好呢,还是两个都一样呢?问题3的试验:
第一种:重写default user
,代码如下,报错如下:<record model="res.users" id="default_user"> <field name="name">Default User</field> <field name="inherit_id" ref="base.default_user"/> <field name="users" eval="[(4, ref('base.user_root'))]"/> <field name="groups_id" eval="[(4,ref('base.group_user'))]"/> <field name="category_id" ref="module_category_sps_base"/> <field name="perm_read" eval="True"/> <field name="perm_write" eval="False"/> <field name="perm_create" eval="False"/> <field name="perm_unlink" eval="False"/> </record>
报错信息:
2017-09-18 02:27:11,696 4686 ERROR 0905 werkzeug: Error on request: Traceback (most recent call last): File "/usr/lib/python2.7/dist-packages/werkzeug/serving.py", line 180, in run_wsgi execute(self.server.app) File "/usr/lib/python2.7/dist-packages/werkzeug/serving.py", line 168, in execute application_iter = app(environ, start_response) File "/home/odoo/odoo-dev/odoo/odoo/service/server.py", line 250, in app return self.app(e, s) File "/home/odoo/odoo-dev/odoo/odoo/service/wsgi_server.py", line 184, in application return application_unproxied(environ, start_response) File "/home/odoo/odoo-dev/odoo/odoo/service/wsgi_server.py", line 170, in application_unproxied result = handler(environ, start_response) File "/home/odoo/odoo-dev/odoo/odoo/http.py", line 1306, in __call__ return self.dispatch(environ, start_response) File "/home/odoo/odoo-dev/odoo/odoo/http.py", line 1280, in __call__ return self.app(environ, start_wrapped) File "/usr/lib/python2.7/dist-packages/werkzeug/wsgi.py", line 591, in __call__ return self.app(environ, start_response) File "/home/odoo/odoo-dev/odoo/odoo/http.py", line 1461, in dispatch odoo.registry(db).check_signaling() File "/home/odoo/odoo-dev/odoo/odoo/__init__.py", line 52, in registry return modules.registry.Registry(database_name) File "/home/odoo/odoo-dev/odoo/odoo/modules/registry.py", line 59, in __new__ return cls.new(db_name) File "/home/odoo/odoo-dev/odoo/odoo/modules/registry.py", line 82, in new odoo.modules.load_modules(registry._db, force_demo, status, update_module) File "/home/odoo/odoo-dev/odoo/odoo/modules/loading.py", line 335, in load_modules force, status, report, loaded_modules, update_module) File "/home/odoo/odoo-dev/odoo/odoo/modules/loading.py", line 237, in load_marked_modules loaded, processed = load_module_graph(cr, graph, progressdict, report=report, skip_modules=loaded_modules, perform_checks=perform_checks) File "/home/odoo/odoo-dev/odoo/odoo/modules/loading.py", line 156, in load_module_graph _load_data(cr, module_name, idref, mode, kind='data') File "/home/odoo/odoo-dev/odoo/odoo/modules/loading.py", line 95, in _load_data tools.convert_file(cr, module_name, filename, idref, mode, noupdate, kind, report) File "/home/odoo/odoo-dev/odoo/odoo/tools/convert.py", line 845, in convert_file convert_xml_import(cr, module, fp, idref, mode, noupdate, report) File "/home/odoo/odoo-dev/odoo/odoo/tools/convert.py", line 915, in convert_xml_import obj.parse(doc.getroot(), mode=mode) File "/home/odoo/odoo-dev/odoo/odoo/tools/convert.py", line 796, in parse self.parse(rec, mode) File "/home/odoo/odoo-dev/odoo/odoo/tools/convert.py", line 799, in parse self._tags[rec.tag](rec, de, mode=mode) File "/home/odoo/odoo-dev/odoo/odoo/tools/convert.py", line 707, in _tag_record id = self.env(context=rec_context)['ir.model.data']._update(rec_model, self.module, res, rec_id or False, not self.isnoupdate(data_node), noupdate=self.isnoupdate(data_node), mode=self.mode) File "/home/odoo/odoo-dev/odoo/odoo/addons/base/ir/ir_model.py", line 1184, in _update " you can't define a `%s` record with this ID." % (xml_id, imd_model, model) ParseError: "External ID conflict, default_user already refers to a `res.groups` record, you can't define a `res.users` record with this ID." while parsing /home/odoo/odoo-dev/odoo/abbsps/sps_base/security/base_security.xml:83, near <record model="res.users" id="default_user"> <field name="name">Default User</field> <field name="inherit_id" ref="base.default_user"/> <field name="users" eval="[(4, ref('base.user_root'))]"/> <field name="groups_id" eval="[(4,ref('base.group_user'))]"/> <field name="category_id" ref="module_category_sps_base"/> <field name="perm_read" eval="True"/> <field name="perm_write" eval="False"/> <field name="perm_create" eval="False"/> <field name="perm_unlink" eval="False"/> </record>
第二种:重写
group_partner_manager
组的权限:<record model="res.groups" id="group_partner_manager"> <field name="name">Contact Creation</field> <field name="category_id" ref="module_category_sps_base"/> <field name="perm_read" eval="True"/> <field name="perm_write" eval="False"/> <field name="perm_create" eval="False"/> <field name="perm_unlink" eval="False"/> </record>
测试过程:编辑原来的用户或者新建用户,这个组的权限还在,不能默认不勾选,所以代码不起作用,或者写错了.
-
感觉可能你不太理解XML的
record
标签,它是用来定义数据库记录的,model
是记录对应的模型,子标签里面的<field name="字段名">
就是这个记录里面的字段名,你写的方案一:<record model="res.users" id="default_user">
,声明它是一个res.users
记录,但是除了groups_id
其他字段都不是res.users
的。如果你想要default user不默认属于group_partner_manager
组,你可以<record model="res.users" id="base.default_user"> <field name="groups_id" eval="[(3, ref('base.group_partner_manager'))]"/> </record>
注意,我这里是
base.default_user
,而不是default_user
,这个应该是你第一条错误的原因。 -
我上个回复的帖子就是剔除
group_partner_manager
用户组了,你可以试试。至于你odoo的权限配置逻辑可以参考
文档:https://www.odoo.com/documentation/10.0/reference/security.html#field-access
还有我们的一个博文:http://cn.openerp.cn/record_rule/