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.)检索相同的令牌?
答案 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