如何创建在 odoo 13 中下载 pdf 报告的自定义按钮?
How to create a custom button which downloads a pdf report in odoo 13?
我想在 odoo 员工模型中创建一个自定义按钮,它创建并下载包含该员工工作合同的 pdf。我试图对 odoo 中给定的按钮进行逆向工程,但我的每一种方法都失败了。有人知道从哪里开始吗?非常感谢!
我通常 return URL 一个 URL action with the download button, and write a controller。结果是点击按钮实际下载文件。
第一步是编写您的 Qweb 报告。我会在这里写一个示例。请注意,报告 ID 是 action_report_test_contract
,稍后将在控制器中使用。
<?xml version="1.0" encoding="utf-8"?>
<odoo>
<report string="Test Contract" id="action_report_test_contract" model="hr.contract" name="your_module_folder_name.test_contract_report" file="your_module_folder_name.test_contract_report" report_type="qweb-pdf" print_report_name="'%s - Contract' % (object.name)" />
<template id="test_contract_report">
<t t-call="web.html_container">
<t t-foreach="docs" t-as="doc">
<t t-call="web.internal_layout">
<div class="page">
<h1><t t-esc="doc.name"/></h1>
<h2>Employee: <t t-esc="doc.employee_id.name"/></h2>
<h2>Start Date: <t t-esc="doc.date_start"/></h2>
</div>
</t>
</t>
</t>
</template>
</odoo>
不要忘记将报告文件路径添加到您的清单中。测试打印合同中的报告,是的,样品有效。现在继承hr.employee
模块添加下载方法
class HrEmployee(models.Model):
_inherit = "hr.employee"
def button_download_contract(self):
if not self.contract_id:
return
return {
'type' : 'ir.actions.act_url',
'url': '/web/download/test-contract-report?contract_id=%s'%(self.contract_id.id),
'target': 'self',
}
另外,继承视图添加下载按钮:
<button name="button_download_contract" type="object" string="Download Contract" icon="fa-download"/>
最后,完成控制器:
from odoo import http
from odoo.http import request, content_disposition, route
class testDownload(http.Controller):
@route(['/web/download/test-contract-report'], type='http', auth="user")
def download_pdf(self, contract_id, **kw):
employee_contract = request.env['hr.contract'].sudo().search([('id','=',contract_id)], limit=1)
if not employee_contract:
return None
pdf, _ = request.env.ref('your_module_folder_name.action_report_test_contract').sudo().render_qweb_pdf([int(contract_id)])
pdfhttpheaders = [('Content-Type', 'application/pdf'), ('Content-Length', len(pdf)),('Content-Disposition', content_disposition('%s - Contract.PDF' % (employee_contract.name)))]
return request.make_response(pdf, headers=pdfhttpheaders)
请注意,方法 render_qweb_pdf
依赖于报表对象。所以使用 action_report_test_contract
,而不是 test_contract_report
。
我想在 odoo 员工模型中创建一个自定义按钮,它创建并下载包含该员工工作合同的 pdf。我试图对 odoo 中给定的按钮进行逆向工程,但我的每一种方法都失败了。有人知道从哪里开始吗?非常感谢!
我通常 return URL 一个 URL action with the download button, and write a controller。结果是点击按钮实际下载文件。
第一步是编写您的 Qweb 报告。我会在这里写一个示例。请注意,报告 ID 是 action_report_test_contract
,稍后将在控制器中使用。
<?xml version="1.0" encoding="utf-8"?>
<odoo>
<report string="Test Contract" id="action_report_test_contract" model="hr.contract" name="your_module_folder_name.test_contract_report" file="your_module_folder_name.test_contract_report" report_type="qweb-pdf" print_report_name="'%s - Contract' % (object.name)" />
<template id="test_contract_report">
<t t-call="web.html_container">
<t t-foreach="docs" t-as="doc">
<t t-call="web.internal_layout">
<div class="page">
<h1><t t-esc="doc.name"/></h1>
<h2>Employee: <t t-esc="doc.employee_id.name"/></h2>
<h2>Start Date: <t t-esc="doc.date_start"/></h2>
</div>
</t>
</t>
</t>
</template>
</odoo>
不要忘记将报告文件路径添加到您的清单中。测试打印合同中的报告,是的,样品有效。现在继承hr.employee
模块添加下载方法
class HrEmployee(models.Model):
_inherit = "hr.employee"
def button_download_contract(self):
if not self.contract_id:
return
return {
'type' : 'ir.actions.act_url',
'url': '/web/download/test-contract-report?contract_id=%s'%(self.contract_id.id),
'target': 'self',
}
另外,继承视图添加下载按钮:
<button name="button_download_contract" type="object" string="Download Contract" icon="fa-download"/>
最后,完成控制器:
from odoo import http
from odoo.http import request, content_disposition, route
class testDownload(http.Controller):
@route(['/web/download/test-contract-report'], type='http', auth="user")
def download_pdf(self, contract_id, **kw):
employee_contract = request.env['hr.contract'].sudo().search([('id','=',contract_id)], limit=1)
if not employee_contract:
return None
pdf, _ = request.env.ref('your_module_folder_name.action_report_test_contract').sudo().render_qweb_pdf([int(contract_id)])
pdfhttpheaders = [('Content-Type', 'application/pdf'), ('Content-Length', len(pdf)),('Content-Disposition', content_disposition('%s - Contract.PDF' % (employee_contract.name)))]
return request.make_response(pdf, headers=pdfhttpheaders)
请注意,方法 render_qweb_pdf
依赖于报表对象。所以使用 action_report_test_contract
,而不是 test_contract_report
。