Как создать пользовательскую кнопку, которая загружает отчет в формате PDF в odoo 13?

Я хочу создать пользовательскую кнопку в модели сотрудника odoo, которая создает и загружает pdf с рабочим контрактом этого сотрудника. Я пытался перепроектировать данные кнопки в odoo, но каждый мой подход терпел неудачу. У кого-нибудь есть совет, с чего начать? Большое спасибо!


person melanzane    schedule 28.08.2020    source источник


Ответы (1)


Обычно я возвращаю действие с URL с помощью кнопки загрузки и напишите контроллер для URL-адрес. В результате нажатие кнопки фактически загружает файл.

Первый шаг — написать отчет Qweb. Я напишу образец здесь. Обратите внимание, что идентификатор отчета — 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>

Не забудьте добавить путь к файлу отчета в свой файл manufest. Тестовая печать отчета с договора, да образец работает. Теперь унаследуйте модуль 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.

person mingtwo_h9    schedule 02.09.2020