如何允许组的用户在Odoo中修改表单的特定部分?

时间:2015-11-10 10:23:54

标签: python xml python-2.7 odoo-8 odoo

我创建了一个名为会计师的新群组。例如,如果该组的用户打开res.partner表单,则他必须能够全部读取,但只能修改某些特定字段(例如,选项卡 Accountancy 中的字段)。

所以我将权限createwriteunlinkread设置为010会计组的1模型中的res.partner

问题:如果我是会计组的用户,并且我转到res.partner的格式,我会看到编辑按钮,如果我点击它,我将能够修改我想要的任何字段(我不应该只修改标签内的字段)。

所以我想复制menuitem(将属性groups="accountant"放到副本中)和表单(将所有字段只读取除了标签内容之外的所有字段)。

问题:如果我是会计组的用户(其implied_ids列表中包含会计),我会看到两个菜单项(采用正常形式的那个和带有只读字段的重复形式的那个)。

是否可以创建一个菜单项,根据点击上述菜单项的用户组打开一组特定的视图?关于如何成功实现这一点的任何想法?

2 个答案:

答案 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)字段,您可以在其中指定执行菜单操作时要加载的视图的顺序和类型。在您的情况下,您可以指定特定的表单视图'为了你的行动。