【问题标题】:Can I inherit from a standard report in OpenERP?我可以从 OpenERP 中的标准报表继承吗?
【发布时间】:2012-07-20 23:57:52
【问题描述】:

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

【问题讨论】:

    标签: openerp reportlab


    【解决方案1】:

    您不能完全继承另一个报告并仅覆盖一些详细信息,但您可以替换标准报告并使其所有现有链接启动您的新报告。

    我们的zaber_purchase 模块包含用户想要的对采购订单报告的一些更改。这是purchase_report.xml 文件,它用我们的文件替换了standard report

    <?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 才能替换它。该名称必须与您版本的parser file 中的名称匹配,并且 rml 属性必须指向您版本的RML file

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

    【讨论】:

      【解决方案2】:

      Don Kirkby 有一个很好的答案,在我的头撞到墙上一个小时后,我想扩展它。但是,stackoverflow 不会让我评论它,因为我没有足够的代表点,所以相反,我会用未回答的方式向问题发送垃圾邮件。

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

      如果需要,请查看包含所有报告的数据库表 ir_act_report_xml 和将报告(以及其他所有内容)与定义事物的 XML 中的 id 属性相关联的 ir_model_data

      【讨论】:

      • 感谢@Phil 的反馈。我在答案中添加了对模块名称空间的更多解释。仅供参考,您是否发现示例模块的链接有帮助,还是只是令人困惑?
      • 顺便说一句,我不认为你的回答有什么问题。在 Stack Overflow 上复制其他人的答案然后将新信息添加到您的版本中是完全可以接受的。即使在不添加任何原始信息的情况下,将几个不同的答案组合成一个综合答案也会很有帮助。欢迎来到本站。
      • 示例模块很有帮助。我建议添加一个指向 XML 的链接,该链接定义了您的示例模块所替换的报告,这应该使正确的关系更加明显。
      【解决方案3】:

      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
       )
      

      【讨论】:

        猜你喜欢
        • 2013-04-06
        • 2015-10-19
        • 1970-01-01
        • 2023-03-28
        • 2015-08-23
        • 1970-01-01
        • 1970-01-01
        • 2018-03-07
        • 1970-01-01
        相关资源
        最近更新 更多