如何动态设置树视图删除状态?

时间:2014-10-27 07:50:40

标签: openerp odoo openerp-8

我已将order_line设置为可编辑,并且如果它不处于草稿模式,则要删除删除按钮。我尝试了以下但删除按钮仍然是:

<xpath expr="//field[@name='order_line']//tree" position="attributes">
  <attribute name="delete" domain="[(parent.state,'!=','draft')]"/>
</xpath>

是否可以根据父级的草稿状态动态设置delete = false?

我试过了:

<record id="delete_drafts_only" model="ir.rule">
  <field name="name">You can only delete items with draft parents</field>
  <field name="model_id" ref="sale.model_sale_order_line"/>
  <field name="global" eval="True"/>
  <field name="domain_force">[('parent.state', '=', 'draft')]</field>
  <field name="perm_unlink" eval="True"/>
</record>

<record id="delete_drafts_only" model="ir.rule">
  <field name="name">You can only delete items with draft parents</field>
  <field name="model_id" ref="sale.model_sale_order_line"/>
  <field name="global" eval="True"/>
  <field name="domain_force">[('parent.state', '!=', 'draft')]</field>
  <field name="perm_read" eval="True"/>
  <field name="perm_write" eval="True"/>
  <field name="perm_create" eval="False"/>
  <field name="perm_unlink" eval="False"/>
</record>

但似乎并没有真正适用。似乎唯一有用的就是操纵ir_model_access,但是全局切换它并不是我想要的。

enter image description here

3 个答案:

答案 0 :(得分:2)

我已经使something similar工作了,也使用了记录规则。

这些行应该具有删除权限,以便删除按钮可以在表单中使用,并且如果满足某些条件,记录规则应该拒绝删除访问。

所以你的第二条记录规则应该有效。 问题是删除按钮仍然可见,但规则会引发Access错误,从而有效地执行它。

您可以尝试删除global选项并将规则分配给组:

<record id="delete_drafts_only" model="ir.rule">
  <field name="name">You can only delete items with draft parents</field>
  <field name="model_id" ref="sale.model_sale_order_line"/>
  <field name="domain_force">[('parent.state', '!=', 'draft')]</field>
  <field name="groups" eval="[(4,ref('base.group_user'))]"/>
  <field name="perm_read" eval="True"/>
  <field name="perm_write" eval="True"/>
  <field name="perm_create" eval="False"/>
  <field name="perm_unlink" eval="False"/>
</record>

答案 1 :(得分:1)

您编写的“ir.rule”解决方案几乎可以使用:删除按钮仍然可见,但是当您尝试保存时,它会为您提供无效访问的例外。

此外,背后的逻辑是不同的:为了“禁用”删除一行,你应该使用否定逻辑。这对我有用:

<record id="delete_drafts_only" model="ir.rule">
  <field name="name">You can only delete items with draft parents</field>
  <field name="model_id" ref="sale.model_sale_order_line"/>
  <field name="domain_force">[('state', '=', 'draft')]</field>
  <field name="groups" eval="[(4,ref('base.group_user'))]"/>
  <field name="perm_read" eval="False"/>
  <field name="perm_write" eval="False"/>
  <field name="perm_create" eval="False"/>
  <field name="perm_unlink" eval="True"/>
</record>

我认为语义是:

  • domain_force字段指出必须考虑模型的哪些记录
  • perm_ *字段表示无法执行哪些操作(因此“False”值表示可以执行操作,反之亦然)

答案 2 :(得分:0)

而不是删除你可以使用给定的标准使其不可见

<xpath expr="//field[@name='order_line']//tree" position='attributes'>
<attribute name='invisible' attrs="{'invisible':[('parent.state','!=','draft')]}">1</attribute>
</xpath>

这只是一个简单的想法..试试吧。