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. 私は多くの製品タイプを持っていますが、タイプごとに機能を作成する傾向はありません。私がやろうとしているように、何らかの方法で引数を渡したり、この目的のためにコンテキストを使用したりできますか? もしそうなら、コードでどのように使用しますか?

ありがとう

EDIT :次のコードも試してみましたが、うまくいきませんでした:

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

コードに 1 つ、おそらく 2 つの問題があります。

このコードが OpenERP 6.1 以前で実行されることを意図している場合、フィールド定義で引数「メソッド」を提供し、それを true に設定する必要があります。そうしないと、メソッドが見つかりません。

あなたの関数は一般的ではありません。「ids」パラメーターで関数に指定された ID をキーとして、辞書を返す必要があります。OpenERP コアに渡すほぼすべての関数は、単一のレコードではなく、一連のレコードに対して機能する必要があることを覚えておく必要があります。例については、コア コードを参照してください。

2 番目の質問については、ビュー XMLのコンテキストにいつでもデータを追加できます。これは、これらのビューを処理するコードで使用できるようになります。これは、製品タイプごとに異なるビューがある場合にのみ機能します。

もう 1 つの可能性は、すべての製品の汎用ツリー ビューを定義し、目的の製品のみを表示するフィルターを定義することです。開発者ブックには、その方法が説明されています。

編集:アクションまたはフィルターで次のようなドメイン式を使用できるはずです:

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