Odoo v12 API 获取发票 PDF
Odoo v12 API get invoice PDF
让我开始使用 C# Odoo API 实现。我有使用 CookComputing.XmlRpcV2 检索发票列表的工作代码。
我想要实现的是 retrieve/download 所选发票的 PDF 选项。有人知道我需要什么才能完成这项工作吗?
当我搜索时,我发现论坛帖子说报告从 V11 开始不起作用,例如 this one。我也没有在 V12 的在线文档中看到它,尽管在 V10 的页面底部提到了它。
更新
有人提到要构造一个 URL:
http://localhost:8069/my/invoices/1?report_type=pdf&download=true&access_token=<ACCESSTOKEN>
其中 1
是发票 ID。从技术上讲这是可行的,但需要我使用浏览器登录到门户。即使我可以从我的 C# 服务登录门户,我也不知道 where/how 来检索正确的访问令牌。我可以看到这是 GUID 形式。有谁知道这是否与我可以从 OAuth2 REST API(付费模块 b.t.w。)检索到的令牌相同?
我会尝试将 /xmlrpc/2/object
与模型 ir.actions.report
和方法 render_qweb_pdf
一起使用。请记住,您需要 ir.actions.report
记录,因为 render_qweb_pdf
不是 "model method"(在 OOP class 方法中)。
正确。您可以在 access_token.
中下载 PDF
这是我为 Odoo v.12 找到的唯一方法。在反复将我的头撞到砖墙上之后。虽然我的示例编程语言是 Python 3,而不是 C#,但我相信你可以适应它。
odoo_url_host = "https://company.odoo.com"
可以在发票的 JSON 回复中找到 access_token。
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 编写的方式。
此外,请确保您在发票上单击 'share'(在 odoo 中),因为有时不会为该发票生成 access_token,否则 returns 为 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。无论如何 :) 编码愉快。
最简单的方法是使用 OdooRPC 库:https://pythonhosted.org/OdooRPC/ref_report.html
我目前正在测试类似的功能,但是 stock.picking
我需要从远程 Odoo
实例下载交付表单并在另一个实例中另存为 attachment
。我所做的是将此功能添加到远程 Odoo
.
中的 stock.picking
@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#
中可以做的是获取 base64
并将其保存为 PDF(如果您喜欢以类似的方式进行)。
我想要实现的是 retrieve/download 所选发票的 PDF 选项。有人知道我需要什么才能完成这项工作吗?
当我搜索时,我发现论坛帖子说报告从 V11 开始不起作用,例如 this one。我也没有在 V12 的在线文档中看到它,尽管在 V10 的页面底部提到了它。
更新
有人提到要构造一个 URL:
http://localhost:8069/my/invoices/1?report_type=pdf&download=true&access_token=<ACCESSTOKEN>
其中 1
是发票 ID。从技术上讲这是可行的,但需要我使用浏览器登录到门户。即使我可以从我的 C# 服务登录门户,我也不知道 where/how 来检索正确的访问令牌。我可以看到这是 GUID 形式。有谁知道这是否与我可以从 OAuth2 REST API(付费模块 b.t.w。)检索到的令牌相同?
我会尝试将 /xmlrpc/2/object
与模型 ir.actions.report
和方法 render_qweb_pdf
一起使用。请记住,您需要 ir.actions.report
记录,因为 render_qweb_pdf
不是 "model method"(在 OOP class 方法中)。
正确。您可以在 access_token.
中下载 PDF这是我为 Odoo v.12 找到的唯一方法。在反复将我的头撞到砖墙上之后。虽然我的示例编程语言是 Python 3,而不是 C#,但我相信你可以适应它。
odoo_url_host = "https://company.odoo.com"
可以在发票的 JSON 回复中找到 access_token。
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 编写的方式。
此外,请确保您在发票上单击 'share'(在 odoo 中),因为有时不会为该发票生成 access_token,否则 returns 为 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。无论如何 :) 编码愉快。
最简单的方法是使用 OdooRPC 库:https://pythonhosted.org/OdooRPC/ref_report.html
我目前正在测试类似的功能,但是 stock.picking
我需要从远程 Odoo
实例下载交付表单并在另一个实例中另存为 attachment
。我所做的是将此功能添加到远程 Odoo
.
stock.picking
@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#
中可以做的是获取 base64
并将其保存为 PDF(如果您喜欢以类似的方式进行)。