我可以继承OpenERP中的标准报告吗?

时间:2012-07-20 23:57:53

标签: openerp reportlab

我想在OpenERP 6.1中更改采购订单报告。我是否必须进入并对购买模块进行更改,或者我是否可以创建一个新模块来继承标准报告并覆盖一些细节。

3 个答案:

答案 0 :(得分:7)

您无法完全继承其他报告,只是覆盖一些详细信息,但您可以替换标准报告,并使其所有现有链接代替启动新报告。

我们的zaber_purchase模块包含对用户所需的采购订单报告的一些更改。这是用purchase_report.xml取代standard reportparser file文件。

<?xml version="1.0" encoding="utf-8"?>
<openerp>
    <data>
        <report 
            auto="False" 
            id="purchase.report_purchase_order" 
            model="purchase.order" 
            name="purchase.order.zaber"
            rml="zaber_purchase/report/order.rml" 
            string="Purchase Order"
            usage="default"/>
    </data>
</openerp>

由于它不是继承而是替换报告,因此您必须在您的版本中复制整个报告。您的报告的ID必须与原始报告的ID相匹配,包括模块名称。在上面的示例中,原始报告的ID为report_purchase_order,并且它是purchase模块的一部分,因此您的报告ID必须为purchase.report_purchase_order才能替换它。该名称必须与您的版本RML file中的名称相匹配,并且rml属性必须指向您的版本mihai

感谢{{3}}在OpenERP论坛中解释了大部分内容。

答案 1 :(得分:3)

Don Kirkby有一个很好的答案,在我的头撞墙一小时后,我想扩大它。但是,凭借其智慧,stackoverflow不会让我对它发表评论,因为我没有足够的重复点,所以相反,我会用一个unanswer垃圾邮件。

“id必须与原始报告的ID相匹配,包括模块名称,”Don表示如果foomodule有<report id="fooreport" ...>,那么在您的模块中,您需要说<report id="foomodule.fooreport" ...>。这是因为每个模块声明的id都存在于作用于该模块的命名空间中。如果你没有引用另一个(你要覆盖的那个)模块的命名空间,那么你最终会创建一个同名的新报告。

对于kicks,请查看包含所有报告的数据库表ir_act_report_xmlir_model_data,它将报告(以及其他所有内容)与XML中的id属性相关联定义了这个东西。

答案 2 :(得分:3)

RML解析器类全局注册为Services。例如,销售订单解析器类已在addons / sale / report / sale_order.py中注册

report_sxw.report_sxw('report.sale.order', 'sale.order', 'addons/sale/report/sale_order.rml', parser=order, header="external")

如果您尝试创建另一个具有相同名称的解析器,则会出现错误:报告“sale.order”已经存在!

替换sale.order解析器并使用自定义解析器类的一种简单方法是使用以下命令将其从全局服务注册表中删除:

from netsvc import Service
del Service._services['report.sale.order']

以下是我们用于在没有折扣的情况下有条理地隐藏销售订单报告中的折扣列的完整示例

from sale.report import sale_order
from report import report_sxw

# create a custom parser inherited from sale order parser:
class new_order_parser(sale_order.order):
    '''Custom parser with an additional method
    '''
    def __init__(self, cr, uid, name, context):
    super(new_order_parser, self).__init__(cr, uid, name, context=context)
    self.localcontext.update({
        'has_line_discount': self._has_line_discount,
    })

    def _has_line_discount(self, order):
        return any([l.discount for l in order.order_line])


# remove previous sale.report service :
from netsvc import Service
del Service._services['report.sale.order']

# register the new report service :
report_sxw.report_sxw(
 'report.sale.order',
 'sale.order',
 'addons/path/to/the/sale_order.rml',
 parser=new_order_parser
 )