对行项目属性的openerp域过滤器

时间:2013-03-05 13:50:46

标签: openerp

我正在尝试根据订单项的属性过滤采购订单。因此,举例来说,我希望查看所有包含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

1 个答案:

答案 0 :(得分:2)

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

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

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

关于第二个问题,您可以始终在视图XML中add data to the context,然后在处理这些视图的代码中可以使用它。这仅适用于每种产品类型都有不同视图的情况。

另一种可能性是为所有产品定义通用树视图并定义过滤器,该过滤器仅显示所需的产品。 developer book describes如何做到这一点。

修改:您应该可以在操作或过滤器中使用如下所示的域表达式:

<field name="domain">[('order_line.product_type','=','X')]</field>