Cette question m'a permis de démarrer avec l'implémentation de mon API C # Odoo. J'ai un code de travail utilisant CookComputing.XmlRpcV2 pour récupérer une liste de factures.
Ce que je voudrais implémenter, c'est la possibilité de récupérer / télécharger un PDF d'une facture sélectionnée. Quelqu'un sait-il de quoi j'ai besoin pour faire cela?
Lorsque je recherche, je trouve des messages de forum indiquant que les rapports ne fonctionnent pas depuis la V11, comme celui-ci . Je ne le vois pas non plus mentionné dans la documentation en ligne de la V12, bien qu'il en soit fait mention au bas de la page pour la V10.
Quelqu'un a mentionné pour construire une URL:
http://localhost:8069/my/invoices/1?report_type=pdf&download=true&access_token=<ACCESSTOKEN>
Où 1
est l'ID de la facture. Techniquement, cela fonctionne, mais nécessite que je sois connecté au portail à l'aide du navigateur. Même si je peux me connecter au portail à partir de mon service C #, je ne sais pas où / comment récupérer le jeton d'accès correct. Je peux voir que c'est sous forme de GUID. Est-ce que quelqu'un sait si c'est le même jeton que je pourrais récupérer de l'API REST OAuth2 (qui est un module payant b.t.w.)?
4 Réponses :
J'essaierais d'utiliser / xmlrpc / 2 / object
avec le modèle ir.actions.report
et la méthode render_qweb_pdf
. Gardez à l'esprit que vous aurez besoin d'un enregistrement ir.actions.report
, car render_qweb_pdf
n'est pas une "méthode modèle" (dans la méthode de classe OOP). P >
Comment créer un enregistrement ir.actions.report
?
Vous n'êtes pas obligé de les créer, il y en a déjà un pour les factures.
Correct. Vous pouvez télécharger le PDF en le plaçant dans le access_token.
C'est le seul moyen que j'ai réussi à comprendre pour Odoo v.12. après m'être fracassé la tête contre un mur de briques à plusieurs reprises. Mon exemple de langage de programmation est avec Python 3, pas C #, mais je suis sûr que vous pouvez l'adapter.
ctx = {'active_model': 'account.invoice', 'active_id': invoice_id} print(models.execute_kw(db, uid, password, 'portal.share', 'default_get',[{}],{'context': ctx}))
Le access_token peut être trouvé dans la réponse JSON de la facture.
import urllib.request pdf_destination = "./invoices/invoice-%d.pdf" % invoice_id urllib.request.urlretrieve(download_url, pdf_destination)
qui, à condition de récupérer une facture trouvée, vous pouvez utiliser la réponse comme suit:
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"])
Une idée de la façon dont cela pourrait être fait pour les attachements ir? Je suis capable de créer une URL de la manière des pièces jointes, mais access_token ne semble pas fonctionner, cependant les URL sans access_token fonctionnent correctement dans le navigateur une fois connecté. J'ai essayé d'appeler le portal.share
avec ir. pièce jointe
comme ctx mais obtenir la réponse `\ 'ir.attachment \' l'objet n'a pas d'attribut \ 'get_base_url \'`
La manière la plus simple est d'utiliser la bibliothèque OdooRPC: https://pythonhosted.org/OdooRPC/ref_report. html
Merci, mais j'utilise C #, pas Python.
Je teste actuellement une fonctionnalité similaire, mais avec Puis en l'appelant en utilisant Ce que vous pouvez faire en stock.picking
où j'ai besoin d'un formulaire de livraison téléchargé à partir d'une instance distante Odoo
et enregistré en tant que pièce jointe code> dans une autre instance. Ce que j'ai fait, c'est d'ajouter cette fonction à
stock.picking
dans la télécommande Odoo
.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'
})
xmlrpc code> et enregistrez-le en tant que pièce jointe
@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
C #
c'est obtenir le base64
et l'enregistrer au format PDF si vous souhaitez procéder de la même manière.
Merci pour cela, mais malheureusement je n'ai aucun contrôle sur la configuration / installation à distance d'Odoo.