1

我有 OpenERP 外部的代码,可用作现有的产品定价系统。我们的每种产品都有一个以某种复杂的方式确定的基本价格。

这个外部系统通过 RPC api 在 OpenERP 中管理和创建销售订单。

我们想从我们的外部定价系统中删除计算价格信息的代码,/之后/它已经确定了一个基本价格。也就是说,在 OpenERP 术语中,每个产品都会有(比如说)十个不同的标价。

从这里开始,我们想使用 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 via self.browse( ... )[ptype]

我认为修改它的最简单方法是在 product.list_price 上按请求覆盖。我的意思是创建一个在上下文中设置变量的 rpc 方法,并修改 price_get 以读取上下文变量而不是产品对象。

另一种选择是使用线程本地,但这仍然是对 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 回答