odoo添加自定义导出按钮

Author Avatar
呃哦 11月 02, 2018

想要导出产品,由于自定义的导出在导出一些关联字段时,导出的是id而不是想要的name参数,所以只能手动写一个导出功能。

流程

添加一个导出的 act_window 到产品表,该 act_window 对应一个导出记录表的form视图,form视图定义了一个button,button点击生成一个excel并新开一个文件下载地址的url窗口。

创建导出记录表

由于导出按钮是跳转到对应的一个form视图,需要有一个导出文件的二进制字段提供下载,所以创建一个导出的model

from odoo import fields, models, api
import base64
import xlwt
from io import BytesIO


class ExportWizard(models.Model):
    _name = 'export.wizard'

    file = fields.Binary('導出文件')

    def generate_excel(self, product_ids):
        """
        根据产品数据导出excel
        :param product_ids: product.template()
        :return:
        """
        workbook = xlwt.Workbook(encoding='utf-8')
        worksheet = workbook.add_sheet('產品清單')

        # add header
        header = ['編號', '名稱', '單價', '單位']
        for col in range(len(header)):
            worksheet.write(0, col, header[col])

        # add data
        for row in range(1, len(product_ids)+1):
            product_id = product_ids[row-1]
            worksheet.write(row, 0, product_id.id)
            worksheet.write(row, 1, product_id.name)
            worksheet.write(row, 2, product_id.list_price)
            worksheet.write(row, 3, product_id.uom_id.name)

        # save
        buffer = BytesIO()
        workbook.save(buffer)
        return base64.encodebytes(buffer.getvalue())

    @api.multi
    def action_export(self):
        context = dict(self._context or {})
        active_ids = context.get('active_ids', []) or []
        product_tmpl_ids = self.env['product.template'].search([('id', 'in', active_ids)])
        self.file = self.generate_excel(product_tmpl_ids)

        value = dict(
            type='ir.actions.act_url',
            target='new',
            url='/web/content?model=%s&id=%s&field=file&download=true&filename=product.xls' % (self._name, self.id),
        )
        return value

创建导出记录表的视图

<record id="wizard_view" model="ir.ui.view">
    <field name="name">export wizard</field>
    <field name="model">export.wizard</field>
    <field name="arch" type="xml">
        <form string="導出記錄">
            <footer>
                <button string="下載" class="btn-primary" name="action_export" type="object"/>
                <button string="關閉" class="btn-default" special="cancel" />
            </footer>
        </form>
    </field>
</record>

添加导出按钮到目标表的action(动作)下拉列表中

<act_window id="export_wizard_action"
            name="導出Excel"
            src_model="product.template"
            res_model="export.wizard"
            view_type="form" view_mode="form"
            target="new"/>

其中,

  • src_model 表示在哪个 model 上添加这个 act_window

  • res_model 表示这个 act_window 将会跳转到哪一个 model

  • view_type res_model 显示的视图类型

  • view_mode res_model 显示的视图种类列表

  • target 视图在当前视图(src_model) 上的打开方式。

    • 在当前视图上打开(current)
    • 使用全屏模式(fullscreen)
    • 使用弹出框(new)
    • 用main代替current来清除面包屑导航