Odoo:将二进制字段内容下载为文本文件

时间:2017-02-07 17:33:50

标签: python-2.7 download odoo-8

我正在制作一个插件,用于在分号分隔文件中导出发票。我创建了一个向导来选择要导出的发票,我可以在my_module / data / invoices.txt中的文件中写入数据。现在我想下载这个文件,我在web插件中使用了saveas方法,但我最终得到了404错误(我在向导中有一个二进制字段(txt_file),将文件的内容存储为base64编码数据)。 这是我正在使用的代码:

@api.multi
def export(self):
    self.ensure_one()
    if self.invoice_ids:
        lines = []
        for line in self.invoice_ids:
            str_line = ''
            str_line += str(line.partner_id.name) + ';'
            str_line += str(line.number) + ';'
            str_line += str(line.origin) + ';'
            str_line += str(line.date_invoice) + ';'
            str_line += str(line.date_due) + ';'
            str_line += line.account_id.name + ';'
            str_line += line.journal_id.name + ';'
            str_line += str(line.amount_untaxed) + ';'
            str_line += str(line.amount_total) + ';'
            str_line = str_line.encode('utf-8')
            lines.append(str_line)
        import os.path

        my_path = os.path.abspath(os.path.dirname(__file__))
        path = os.path.join(my_path, "../data/invoices.txt")

        file = open(path, 'w+')
        if file:
            output = ''
            for line in lines:
                output += line + '\n'
            self.txt_file = base64.b64encode(output)

            file.write(base64.b64decode(self.txt_file))
            wizard = self.env['export_invoice.wizard'].with_context({'active_id': self.id}).create({})
            # I have found this on the web
            return {
                'type': 'ir.actions.act_url',
                'url': '/web/binary/saveas?model=export_invoice.wizard&field=txt_file&id=%s&filename_field=invoices.txt' % (
                wizard.id),
                'target': 'self',
            }

1 个答案:

答案 0 :(得分:0)

我认为问题可能出在

wizard = self.env['export_invoice.wizard'].with_context({'active_id': self.id}).create({})

如果想要将指定的上下文添加到向导而不另外修改它,请不要添加.create,使用空dict调用将创建并返回一个空的向导记录,其中没有内容文件字段,因此是404。

wizard = self.env['export_invoice.wizard'].with_context({'active_id': self.id})

另外,filename_field GET参数需要包含文件名的模型字段名称,而不是实际的文件名。这不应该破坏下载,但会生成下载文件名,而不是指定的名称。