我想在 OpenERP 6.1 中更改采购订单报告。我是否必须进入并更改购买模块,或者我可以创建一个新模块来继承标准报告并覆盖一些细节。
3 回答
您不能完全继承另一个报告并仅覆盖一些详细信息,但您可以替换标准报告并使其所有现有链接启动您的新报告。
我们的zaber_purchase模块包含用户想要的对采购订单报告的一些更改。这是将标准报告替换为我们的报告的purchase_report.xml文件。
<?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 属性必须指向您版本的RML 文件。
感谢mihai在 OpenERP 论坛中解释了大部分内容。
Don Kirkby 有一个很好的答案,在将我的头撞到墙上一个小时后,我想扩展它。但是 stackoverflow 不让我评论它,因为我没有足够的代表点,所以相反,我会用一个没有答案的垃圾邮件问题。
“id 必须与原始报告的 id 匹配,包括模块名称”,Don 的意思是如果 foomodule 有<report id="fooreport" ...>
,那么在你的模块中你需要说<report id="foomodule.fooreport" ...>
。这是因为每个模块声明的 id 都存在于该模块范围内的命名空间中。如果您不引用另一个(您正在覆盖的那个)模块的命名空间,那么您最终只会创建一个具有相同名称的新报告,即 Bad。
需要注意的是,查看ir_act_report_xml
包含所有报告的数据库表,以及ir_model_data
将报告(和其他所有内容)与id
定义事物的 XML 中的属性相关联的数据库表。
RML 解析器类被全局注册为服务。例如,销售订单解析器类在 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
)