Odoo v12 API获取发票PDF

时间:2019-01-30 12:55:35

标签: api odoo xml-rpc invoice odoo-12

This question使我开始使用C#Odoo API实现。我有使用CookComputing.XmlRpcV2检索发票清单的工作代码。

我要实现的是用于检索/下载所选发票PDF的选项。有人知道我将需要完成什么吗?

搜索时,我发现论坛上的帖子指出自V11起,报告就无法使用,例如this one。尽管在V10页面的底部也没有提及它,但我在V12的在线文档中也没有提到它。

更新

提到有人构造URL:

http://localhost:8069/my/invoices/1?report_type=pdf&download=true&access_token=<ACCESSTOKEN>

其中1是发票ID。从技术上讲这是可行的,但需要我使用浏览器登录到门户。即使可以从C#服务登录门户,我也不知道在哪里/如何检索正确的访问令牌。我可以看到这是GUID形式。有人知道我是否可以从OAuth2 REST API(这是一个付费模块b.t.w.)检索相同的令牌?

4 个答案:

答案 0 :(得分:1)

我会尝试将/xmlrpc/2/object与模型ir.actions.report和方法render_qweb_pdf一起使用。请记住,您需要一条ir.actions.report记录,因为render_qweb_pdf不是“模型方法”(在OOP类方法中)。

答案 1 :(得分:1)

正确。您可以通过放置在access_token中来下载PDF。

这是我设法弄清Odoo v.12的唯一方法。反复将我的头撞在砖墙上之后。我的示例编程语言虽然使用的是Python 3,而不是C#,但是我敢肯定您可以适应它。

odoo_url_host = "https://company.odoo.com"

access_token 可在发票的JSON响应中找到。

invoice_id = 1234
models = xmlrpcclient.ServerProxy('{}/xmlrpc/2/object'.format(odoo_url_host))
invoice = models.execute_kw(db, uid, password, "account.invoice", read, [[invoice_id]])

,只要您取回已找到的发票,就可以像这样使用响应:

print(invoice["access_token"])

download_url = "%s/%s/my/invoices/%d?report_type=pdf&download=true&access_token=%s" % (odoo_url_host, invoice_id, invoice["access_token"])

如果您只是想自动下载,可以这样:

import urllib.request

pdf_destination = "./invoices/invoice-%d.pdf" % invoice_id

urllib.request.urlretrieve(download_url, pdf_destination)

您需要更改为Python 2.7编写的方式。

此外,请确保您单击发票上的“共享”(在odoo内),因为有时不会为该发票生成access_token,否则返回false。

或者,如果您想无缝地生成access_token,请在尝试获取访问令牌之前执行以下步骤:

ctx = {'active_model': 'account.invoice', 'active_id': invoice_id}
print(models.execute_kw(db, uid, password, 'portal.share', 'default_get',[{}],{'context': ctx}))

那应该为您获得整个文档的share_link,但是您所需要的只是要生成的access_token。如果您愿意,可以从JSON响应中的share_link值中提取access_token。无论如何:)编码愉快。

答案 2 :(得分:1)

我目前正在测试类似的功能,但是使用stock.picking时,我需要从远程Odoo实例下载交付表单并在另一个实例中另存为attachment。我所做的就是将此功能添加到远程stock.picking的{​​{1}}中。

Odoo

然后使用@api.model def sd_get_delivery_form(self, uid): picking = self.env['stock.picking'].sudo().search([('sd_uid', 'like', uid)], limit=1) if picking and picking.sale_id: pdf = self.env.ref('sale.action_report_saleorder').sudo().render_qweb_pdf([picking.sale_id.id]) b64_pdf = base64.b64encode(pdf[0]) order_pdf = b64_pdf.decode('utf-8') return {'file': order_pdf} else: return False 进行调用并将其另存为附件

xmlrpc

attachment_name = "delivery_order_({})".format(self.id) self.env['ir.attachment'].create({ 'name': attachment_name, 'type': 'binary', 'datas': dt['file'], 'datas_fname': attachment_name + '.pdf', 'store_fname': attachment_name, 'res_model': self._name, 'res_id': self.id, 'mimetype': 'application/x-pdf' }) 中可以做的就是获取C#并将其另存为PDF(如果您希望以类似的方式进行)。

答案 3 :(得分:0)

最简单的方法是使用OdooRPC库:https://pythonhosted.org/OdooRPC/ref_report.html