有条件地隐藏按钮openerp / odoo

时间:2017-03-24 16:12:25

标签: xpath openerp odoo-8 qweb

我有一个按钮,只有当用户是超级用户(admin)时才需要显示。我的问题是,当我使用xpath包含attrs时,没有任何工作正常。我的代码是:

<record id="wms_stock_view_move_form" model="ir.ui.view">
        <field name="name">wms.stock.view.move.form</field>
        <field name="model">stock.move</field>
        <field name="inherit_id" ref="stock.view_move_form" />
        <field name="arch" type="xml">
            <field name="location_id" position="attributes">
                <attribute name="domain">[('name','!=', 'Scrapped')]</attribute>
            </field>
            <field name="location_id" position="after">
                <field name="is_superuser"/>
            </field>
            <field name="location_dest_id" position="attributes">
                <attribute name="domain">[('name','!=', 'Scrapped')]</attribute>
            </field>
            <xpath expr='//form[@string="Stock Moves"]' position='attributes'>
                <attribute name="create">false</attribute>
                <attribute name="edit">false</attribute>
                <attribute name="delete">false</attribute>
            </xpath>
            <xpath expr="//button[@name='action_cancel']" position="attributes">
                <attribute name="attrs">{'invisible':[('is_superuser','=', True)]}</attribute>
            </xpath>

        </field>
    </record>

这里,is_superuser是一个计算字段,其代码是:

is_superuser = fields.Boolean(compute='_is_super_user')

def _is_super_user(self):

    if self._uid == SUPERUSER_ID:
        self.is_superuser = True
    else:
        self.is_superuser = False

按钮的原始代码在原始视图中为:

<button name="action_cancel" states="draft,assigned,confirmed" string="Cancel Move" type="object"/>

任何想法,我做错了什么?提前谢谢。

3 个答案:

答案 0 :(得分:1)

我更愿意使用Odoo的群组访问系统来实现此类行为。只需使用属性groups扩展按钮,然后使用正确的组(例如base.group_systembase.group_no_one来管理员):

<field name="action_cancel" states="draft,assigned,confirmed" position="attributes">
    <attribute name="groups">base.group_system</attribute>
</field>

答案 1 :(得分:0)

您正在使用的代码应该有效:    首先,您需要将@api.depends()放在方法定义上,而不放置任何字段,以便每次调用记录时都会计算它。    第二步检查计算字段的结果,因为xml代码是正确的,使用print在控制台中查看我工作的代码是否被调用方法。

答案 2 :(得分:0)

我非常感谢你的帮助,但上述回复对我没有帮助。但是,我找到了这个问题的答案。由于它包含各州,我们也需要考虑到这一点。我们需要覆盖“状态”的行为。标签也是。所以代码必须是:

<xpath expr="//button[@name='action_cancel']" position="attributes">
                <attribute name="states"></attribute>
                <attribute name="attrs">{'invisible':['|', ('is_superuser','=', False), ('state', 'not in', ('draft','assigned','confirmed'))]}</attribute>
            </xpath>