Odoo - 隐藏特定用户的按钮

时间:2017-06-23 17:12:02

标签: python xml odoo-10 odoo

我正在使用odoo 10 enterpeise。我想向特定用户显示按钮而不是组,因为组中有很多用户,我想只显示下面的按钮,他们有优势拒绝/批准对象。 这是按钮

Error:(751, 45) error: incompatible types: ShareDialog cannot be converted to FacebookDialogBase<ShareContent<?,?>,Result>

我尝试使用<xpath expr="//sheet" position="before"> <header> <button name="update_approve" attrs="{'invisible':[('first_approve', '=', uid)]}" string="Approve" type="object" class="oe_highlight"/> <button name="update_reject" attrs="{'invisible':[('second_approve', '=', uid)]}" string="Reject" type="object" class="btn-danger"/> </header> </xpath> 执行此操作,但uid在xml

中不可用

uidfirst_approve是我的模型中的字段,我希望仅向second_approve

中分配的用户显示按钮

2 个答案:

答案 0 :(得分:3)

我知道在场地中使用场地的其中一项必须在表格中提及。  我不知道如何在表单中获取用户ID的值。但如果没有短暂的  像uiduser一样你可以在这周围工作,只需为res.users创建一个m2o字段  使用store = False创建此字段计算字段。

    # by default store = False this means the value of this field
    # is always computed.
    current_user = fields.Many2one('res.users', compute='_get_current_user')

    @api.depends()
    def _get_current_user(self):
        for rec in self:
            rec.current_user = self.env.user
        # i think this work too so you don't have to loop
        self.write({'current_user' : self.env.user.id})

您可以在表单中使用此字段。

    <xpath expr="//sheet" position="before">
              <header>
                 <!-- fin a good place for the field if i make the header look ugly -->
                <!-- make invisible -->
                 <field name="current_user" invisible="1"/>
                                                                                    <!-- hope it work like this -->
                <button name="update_approve" attrs="{'invisible':[('first_approve', '=', current_user)]}" string="Approve" type="object" class="oe_highlight"/>
                <button name="update_reject" attrs="{'invisible':[('second_approve', '=', current_user)]}" string="Reject" type="object" class="btn-danger"/>
              </header>
     </xpath>
抱歉我的英语。

答案 1 :(得分:2)

我了解到您有一个可以批准的固定用户列表和其他能够拒绝的用户。尽管只是少数用户,但我会在你的按钮上创建两个组并使用groups属性,但即便如此,你也不想为它们创建几个组,你可以这样做:

from openerp import models, api
import json
from lxml import etree

FIRST_APPROVE = []  # Fill this list with the IDs of the users who can update approve
SECOND_APPROVE = []  # Fill this list with the IDs of the users who can update reject

class YourClass(models.Model):
    _inherit = 'your.class'

    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)

    @api.model
    def fields_view_get(self, view_id=None, view_type='form', toolbar=False,
                        submenu=False):
        res = super(YourClass, self).fields_view_get(
            view_id=view_id, view_type=view_type, toolbar=toolbar,
            submenu=submenu)

        doc = etree.XML(res['arch'])

        if view_type == 'form':
            if self.env.uid in FIRST_APPROVE:
                upd_approve_btn_search = doc.xpath("//button[@name='update_approve']")
                upd_approve_btn = upd_approve_btn_search[0] \
                    if upd_approve_btn_search else False
                if upd_approve_btn:
                    self.set_modifiers(upd_approve_btn, {'invisible': False, })

            if self.env.uid in SECOND_APPROVE:
                upd_reject_btn_search = doc.xpath("//button[@name='update_reject']")
                upd_reject_btn = upd_reject_btn_search[0] \
                    if upd_reject_btn_search else False
                if upd_reject_btn:
                    self.set_modifiers(upd_reject_btn, {'invisible': False, })

        res['arch'] = etree.tostring(doc)
        return res

FIRST APPROVESECOND_APPROVE将是const,您必须在其中引入可以执行相应操作的用户的固定IDS(例如:FIRST APPROVE = [2, 7, 9])。

YourClass必须是您已声明按钮方法的类(您已声明update_approveupdate_reject的方法。)

重要提示:使用此代码,您的按钮必须始终不可见(在XML视图中写入invisible="1"),因为在加载XML代码后,fields_view_get将覆盖{{1}设置为0的值。

这是管理目的的一种罕见方式,但不幸的是,如果您不想创建组,我认为这是最简单的方法。我希望它可以帮助您和其他用户!