我创建了一个名为会计师的新群组。例如,如果该组的用户打开res.partner
表单,则他必须能够全部读取,但只能修改某些特定字段(例如,选项卡 Accountancy 中的字段)。
所以我将权限create
,write
,unlink
,read
设置为0
,1
,0
, 会计组的1
模型中的res.partner
。
问题:如果我是会计组的用户,并且我转到res.partner
的格式,我会看到编辑按钮,如果我点击它,我将能够修改我想要的任何字段(我不应该只修改标签内的字段)。
所以我想复制menuitem(将属性groups="accountant"
放到副本中)和表单(将所有字段只读取除了标签内容之外的所有字段)。
问题:如果我是会计组的用户(其implied_ids
列表中包含会计),我会看到两个菜单项(采用正常形式的那个和带有只读字段的重复形式的那个)。
是否可以创建一个菜单项,根据点击上述菜单项的用户组打开一组特定的视图?关于如何成功实现这一点的任何想法?
答案 0 :(得分:2)
我在网上搜索很多,有很多人在Odoo论坛上提出同样的问题,但是没有人给他们答案。
最后,我找到了这个解决方法,在我的案例中工作得很好:每个模型中的方法field_view_get
在返回它之前获取XML视图。这意味着您可以以任何您想要的方式从Python代码中操作视图。
您只需要知道如何使用像lxml
这样的库来修改XML代码的字符串变量。我举了我的例子:
RES.PARTNER模型(此处我们必须使用etree
库中的lxml
@api.model
def fields_view_get(self, view_id=None, view_type='form', toolbar=False,
submenu=False):
res = super(res_partner, self).fields_view_get(
view_id=view_id, view_type=view_type, toolbar=toolbar,
submenu=submenu)
checking_obj = self.env['my.own.checkings']
doc = etree.XML(res['arch'])
if checking_obj.belongs_to_accountant_group():
doc.set('create', 'false')
doc.set('delete', 'false')
doc.set('edit', 'true')
if view_type == 'form':
accounting_pages = doc.xpath("//page[@name='accounting']")
accounting_page = accounting_pages[0] if accounting_pages \
else False
if accounting_page is not False:
if checking_obj.belongs_to_accountant_group():
all_fields = doc.xpath("//field")
for field in all_fields:
if accounting_page not in field.iterancestors():
checking_obj.set_modifiers(field,
{'readonly': True, })
res['arch'] = etree.tostring(doc)
return res
AUXILIAR CUSTOMIZED模型(名为MY.OWN.CHECKINGS)(这里我们必须使用json
库)
def update_json_data(self, json_data=False, update_data={}):
''' It updates JSON data. It gets JSON data, converts it to a Python
dictionary, updates this, and converts the dictionary to JSON data
again. '''
dict_data = json.loads(json_data) if json_data else {}
dict_data.update(update_data)
return json.dumps(dict_data, ensure_ascii=False)
def set_modifiers(self, element=False, modifiers_upd={}):
''' It updates the JSON modifiers with the specified data to indicate
if a XML tag is readonly or invisible or not. '''
if element is not False: # Do not write only if element:
modifiers = element.get('modifiers') or {}
modifiers_json = self.update_json_data(
modifiers, modifiers_upd)
element.set('modifiers', modifiers_json)
def is_accountant(self):
return self.env.ref(
'my_module.group_accountant').id in \
self.env.user.groups_id.mapped('id')
这样,您可以根据当前用户的组别只读取一些字段。
答案 1 :(得分:1)
您不能将少数或某些字段设为' readonly'在odoo基于组。如果您需要这样做,可以使用自定义模块' smile_model_access_extension'。
要在菜单上点击加载适当的视图,您可以创建' ir.actions.act_window' ' ir.action'的(view_ids)字段,您可以在其中指定执行菜单操作时要加载的视图的顺序和类型。在您的情况下,您可以指定特定的表单视图'为了你的行动。