默认情况下,我们可以将 Odoo 中的报告导出为 PDF 或 HTML。在一些插件的帮助下,似乎也可以导出到 XLS、ODT 等。但我需要的是 XML 格式。在 Odoo 中是否有可能?
当我检查 Odoo 实现时,我想也许可以使用控制器类型报告和一些用于将控制器导出为 XML 的 python 代码。那么您对此有何见解?
我们发现最好为此编写自定义代码,使用 lxml 或用于大输出,xml.sax.saxutils。
同样,根据文件的要求和大小,我们在向导中将其返回或写入磁盘位置并通过电子邮件发送给用户。
如果你想下载 XML 格式的东西,你应该编写一个控制器,并将它链接到一个按钮。看看我的书面文件下载器:
https://github.com/odoo-chile/l10n_cl_dte/blob/8.0/controllers/downloader.py
您还可以在视图中查看我是如何设置按钮的:
<button string="Download XML" type="object" name="get_xml_file"
class="oe_highlight" attrs="{
'invisible':[('state', 'in', ['draft'])]}"/>
..以及models/invoice.py中定义的方法:
def get_xml_file(self):
return {
'type' : 'ir.actions.act_url',
'url': '/web/binary/download_document?model=account.invoice&field=sii_xml_request&id=%s&filename=demoxml.xml' % (self.id),
'target': 'self',
}
有一个模块可以让您创建 xml 报告:report_xml
. 您只需要向您的模块添加一个依赖项并将报告声明为正常报告,如下所示:
<report
id="example_xml_report"
name="module_name.template_custom_id"
string="Example XML Report"
report_type="qweb-xml"
menu="False"
model="account.invoice" />
然后您可以使用 qweb 添加 xml 报告。lxml
直接使用库构建它更方便:
<template id="template_custom_id">
<t t-call="report_xml.utf8_header">
<FIRSTHEADER>
<OPERATION t-esc="operation" />
<OPERATIONTYPE t-esc="operation_type" />
<VERSION t-raw="0">1.0</VERSION> <!-- literal value -->
<ELEMENT t-foreach="docs" t-as="o">
<COMPANYNAME t-esc="o.company_id.name" />
<!-- [...] -->
您可以添加一个 python 类来处理报告的一些自定义数据作为其余报告:
class AccountInvoiceXmlReport(models.AbstractModel):
_name = "report.module_name.template_custom_id"
@api.multi
def render_html(self, data=None):
""" If ``context`` contains a dict called ``docargs``, it will be used as
the Qweb context. The special key ``docs`` will be added to ``docargs``
automatically if missing.
"""
# some operations
docargs = self.env.context.get("docargs", dict())
if "docs" not in docargs:
docargs["docs"] = (account_invoice_obj)
docargs.update({
'operation': self.env.context.get('operation', False),
'operation_type': self.env.context.get('operation_type', False) # TODO >> verify the invoices have the same type
})
result = (
self.env["report"].render( # generate xml report
self._name[len("report."):],
docargs
).strip()
)
return result
正如您可以检查README.rst
要求:
lxml
库。reporting-engine
有关创建报告的更多说明,请访问此处