1

既存の製品価格設定システムとして機能する OpenERP の外部コードがあります。各製品には、やや複雑な方法で決定される基本価格があります。

この外部システムは、RPC API を介して OpenERP で販売注文を管理および作成します。

価格情報を計算する外部価格設定システムからコードを削除したいと考えています。 /after/ 既に基本価格が決定されています。つまり、OpenERP の用語では、各製品には (たとえば) 10 の異なる定価があります。

ここから、OpenERP の価格表システムを使用して、この基本価格をさらに計算します。

現在、OpenERP に製品価格を要求するコードがあります。

...
    date_order = time.strftime(DEFAULT_SERVER_DATE_FORMAT) #Pricelists are seasonal
    price = self.pool.get('product.pricelist').price_get(cr, uid, [pricelist_id], product.id, qty, partner.id, {
        'uom': uom,
        'date': date_order,
    })[pricelist_id]

...
    price_taxes = tax_obj.compute_all(cr, uid, tax_objs, price, qty, billing_addr.id, product.id, partner.id)

これは正しく機能し、特定の製品の価格を教えてくれます。

価格表ツリー (価格表は相互に基づいている可能性があるため) は最終的に を呼び出しproduct_product.price_get(self, cr, uid, ids, ptype='list_price', context=None)、 を介して list_price を読み取りますself.browse( ... )[ptype]

これを変更する最も簡単な方法は、product.list_price をリクエストごとにオーバーライドすることだと思います。これは、コンテキストに変数を設定する rpc メソッドを作成し、price_get を変更して製品オブジェクトではなくコンテキスト var を読み取ることを意味します。

もう 1 つの方法は、スレッド ローカルを使用することですが、これは price_get 関数の変更です。

列の定義をオーバーライドして getter メソッドを追加することを考えていましたが、それが self.browse 呼び出しから使用されるかどうかはわかりません。

あなたは何をお勧めします?オーバーライドするかprice_get、列をオーバーライドするlist_priceか、または何か他のものをオーバーライドしますか?

助けてくれてありがとう。

4

1 に答える 1

2

私はこのように私の問題を解決しました:

class product_product(osv.osv):
    def _get_dyn_list_price(self, cr, uid, ids, field_name, arg, context):
        res = {}
        b = self.browse(cr, uid, ids)
        for obj in b:
            res[obj.id] = context.get('dyn_prices', {}).get(obj.id, None)
        return res

    _name = _inherit = 'product.product'
    _columns = {
        'dynamic_list_price': fields.function(_get_dyn_list_price, type='float', method=True, string='Dynamic List Price', store=False, digits_compute=dp.get_precision('Sale Price'), help="Dynamic base price for product after applying door styles, etc.", readonly=True),
    }

    def price_get(self, cr, uid, ids, ptype='list_price', context=None):
        if ptype != 'list_price':
            return super(product_product, self).price_get(cr, uid, ids, ptype, context)
        ptype = 'dynamic_list_price' #Will cause price_margin / price_extra to not be respected
        res = super(product_product, self).price_get(cr, uid, ids, ptype, context)

        for k, v in res.iteritems():
            if v is None:
                if context.get('require_dyn_prices', False):
                    raise osv.except_osv('Error !', 'Dynamic prices required, but product ID not found in context.')
                res[k] = super(product_product, self).price_get(cr, uid, [k], ptype, context)[k]
        return res

次に、次のように使用できます。

    date_order = time.strftime(DEFAULT_SERVER_DATE_FORMAT) #Pricelists are seasonal
    price = self.pool.get('product.pricelist').price_get(cr, uid, [pricelist_id], product.id, qty, partner.id, {
        'uom': uom,
        'date': date_order,
        'dyn_prices': {product.id: unit_price},
        'require_dyn_prices': True,
    })[pricelist_id]
于 2012-07-10T18:58:53.273 に答える