1

我正在尝试根据其订单项的属性过滤采购订单。因此,例如,我想查看所有具有 product_type = 'X' 的订单项的采购订单。

<record id="po_x" model="ir.actions.act_window">
        <field name="name">X Purchase Orders</field>
        <field name="type">ir.actions.act_window</field>
        <field name="res_model">purchase.order</field>
        <field name="view_type">form</field>
        <field name="view_mode">tree,form,calendar,graph,gantt</field>
        <field name="domain">[('has_x_line','=',True)]</field>
        <field name="context">{}</field>
    </record>

product_type 是我添加到订单行的继承版本的自定义字段。

class purchase_order_custom(osv.osv):
    _name = 'purchase.order'
    _inherit = 'purchase.order'

    def linehasproducttype(self, cr, uid, ids, name, arg, context=None):
        cur_obj={}
        cur_obj=self.browse(cr, uid, ids, context=context)
        for line in cur_obj.order_line:
            if line.product_type == 'X':
                return True
        return False

    _columns={
          'has_x_line': fields.function(linehasproducttype, string="Has X Line", type='boolean', context={'pt':'X'})
              }
purchase_order_custom() 

2个问题:

Q1。上面的代码不起作用。也就是说,它并没有真正按照需要进行过滤。有什么问题?

Q2。我有很多产品类型,我不倾向于为每种类型制作一个功能。我可以以某种方式传递参数或使用上下文来达到这个目的吗?如果是这样,我如何在代码中使用它?

谢谢

编辑:我也尝试过以下代码,但没有成功:

def linehasproducttype(self, cr, uid, ids, name, arg, context=None):
    res = dict.fromkeys(ids, False)
    for cur_obj in self.browse(cr, uid, ids, context=context):
        res[cur_obj.id] = False
        for line in cur_obj.order_line:
            if line.product_type == 'X':
                res[cur_obj.id] = True
    return res
4

1 回答 1

2

您的代码中可能有两个问题:

如果此代码打算在 OpenERP 6.1 或更早版本上运行,您需要在字段定义中提供参数“method”并将其设置为 true,否则将找不到您的方法。

您的功能不是通用的。它需要返回一个字典,并在“ids”参数中为您的函数提供 id 作为键。您必须记住,您传递给 OpenERP 核心的几乎每个函数都需要处理一组记录,而不是单个记录。查看示例的核心代码。

关于您的第二个问题,您始终可以在视图 XML中将数据添加到上下文中,然后在处理这些视图的代码中应该可以使用这些数据。仅当您对每种产品类型都有不同的视图时,这才有效。

另一种可能性是为所有产品定义一个通用树视图并定义一个过滤器,该过滤器将仅显示所需的产品。开发人员手册描述了如何做到这一点。

编辑:您应该能够在您的操作或过滤器中使用如下的域表达式:

<field name="domain">[('order_line.product_type','=','X')]</field>
于 2013-03-05T14:30:57.957 回答