odoorpc.

uN tool semplice e veloce per risolvere un problema veramente comune. importare ed esportare dati.

Sono diverse le librerie Python che ci permettono di connetterci ad Odoo sfruttando il protocollo RPC (XML-RPC, JSON-RPC, ...).

Fino a poco tempo fa, la più conosciuta ed utilizzata era sicuramente ERPPeek (https://erppeek.readthedocs.io).

Da qualche tempo OdooRPC (https://pythonhosted.org/OdooRPC) si è affermato come tools pseudo-ufficiale della community Odoo.

Vediamo quindi come:

  1. Installare OdooRPC

  2. Usare questa libreria per leggere e scrivere dati in Odoo

  3. Importare dati provenienti da sorgenti esterne come files CSV/XML

  4. Estrarre ed esportare dati


Installare OdooRPC.

OdooRPC si installa come una normale libreria Python. Quindi potrere seguire la procedura alla quale siete più affezionati.

Tuttavia il consiglio è di utilizzare pip, al fine di semplificare le future operazioni di aggiornamento o rimozione.

Dando per scontato che abbiate già installato Odoo e tutte le sue dipendenze, possiamo procedere all'installazione di OdooRPC con il seguente comando:

sudo pip install odoorpc
E' da tenere presente che sudo premette l'utilizzo di un sistema Unix-like (Linux, Mac, ...).

Non sarà necessario se l'installazione avverrà all'interno di un virtualenv Python.

Pip è usabile anche su Windows.

Lanciato il comando, il vostro terminale dovrebbe rispondere con qualcosa tipo:

$ pip install odoorpc
Collecting odoorpc
Installing collected packages: odoorpc
Successfully installed odoorpc-0.6.0

Per testare l'avvenuta installazione non ci resta altre che aprire un terminale Python e chiedere di importare la libreria:

$ python 
Python 2.7.13 (default, May 21 2017, 18:29:50) 
[GCC 4.2.1 Compatible Apple LLVM 8.1.0 (clang-802.0.42)] on darwin Type "help", "copyright", "credits" or "license" for more information.
>>> import odoorpc
>>>

Connessione ad Odoo.

Connetterci alla nostra installazione Odoo è veramente semplice (NB: verrà usato IPython nei prossimi esempi al fine di semplificare la distinzione tra l'imput dell'utente e l'output Python):

In [1]: import odoorpc
In [2]: odoo = odoorpc.ODOO('localhost', port=8069)
In [3]: odoo.login('demo_odoorpc', 'admin', 'admin')
In [4]: odoo.env.user.name
Out[4]: u'Administrator'

Come potete notare, la connessione consiste in poche direttive.

In questo caso ci siamo connessi ad un'istanza odoo in esecuzione su localhost e sulla porta 8069.

Dopodiché abbiamo eseguito il login con utente admin e password admin sul database demo_odoorpc.

Infine abbiamo chiesto ad OdooRPC di mostrarci il nome dell'utente con il quale ci siamo connessi.

Env in questo caso è proprio l'Environment disponibili nelle API Odoo standard.

Proprio per questo motivo saremo in grado di accedere ai metodi standard dell'ORM di Odoo come visibile nel seguente esempio:

In [7]: partner_model = odoo.env['res.partner']
In [8]: partner_model.browse(8).name
Out[8]: u'Agrolait'

Spingiamoci quindi oltre e creiamo un nuovo record:

In [9]: partner_model.create({'name': 'BMW Italia Spa'})
Out[9]: 43

Come potete notare, la risposta di OdooRPC è l'ID del record appena creato.

Quindi, con la stessa metodologia possiamo cercare, modificare ed eliminare i record sul db:

In [10]: partner_model.search([('name', '=', 'BMW Italia Spa')])
Out[10]: [43]
In [11]: bmw_italia = partner_model.browse(43)
In [12]: bmw_italia.phone = '02 5161 0111'
In [13]: bmw_italia.phone Out[21]: '02 5161 0111'
In [14]: partner_model.unlink(bmw_italia.id)
Out[14]: True
In [15]: partner_model.search([('name', '=', 'BMW Italia Spa')])
Out[15]: []

Estremamente semplice vero?

In un prossimo how-to vi mostrerò come dialogare con campi più complessi come i campi relazionali (Many2one, Many2many, One2many).


Importare dati.

Librerie come OdooRPC risultano particolarmente comode per l'importazione o l'esportazione di dati.

Una della prima attività, quando si implementa Odoo è spesso l'importazione dei dati pregressi. Soprattutto anagrafiche clienti, fornitori, articoli e così via.

Vediamo quindi come affrontare queste problematiche.


Importazione da CSV.

Immaginiamo di trovarci di fronte ad un CSV (in realtà nulla ci vieta di usare direttamente un documento in formato MS Excel) strutturato come segue:

NomeEmail
Telefono
FCA Italy S.p.A.
info@fca.it
011 986 5211
BMW Italia S.p.A.
info@bmw.it
02 516 0323
Ford Italia S.p.A.
info@ford.it
06 233 0123

Il file è un CSV delimitato da virgole.

Il codice OdooRPC per importare questo file (clienti.csv) apparirebbe semplicemente così:

In [16]: import csv
In [17]: with open('clienti.csv', 'rb') as csvfile:
    ...: rows = csv.DictReader(csvfile, delimiter=',', quotechar='"')
    ...: for row in rows:
    ...: customer_data = {
    ...: 'name': row['Nome'],
    ...: 'email': row['Email'],
    ...: 'phone': row['Telefono']
    ...: }
    ...: new_partner = partner_model.create(customer_data)
    ...: print new_partner
    ...:                
47
48
49


Importazione da XML.

Un altro formato largamente diffuso è sicuramente l'XML.

Vediamo quindi come approcciare l'importazione degli stessi dati nel caso in cui ci venisse fornito un file XML.

Il file XML potrebbe apparire come il seguente:

<?xml version="1.0"?>
<clienti>
  <cliente> 
    <nome>FCA Italy S.p.A.</nome> 
    <email>info@fca.it</email>
    <telefono>011 986 5211</telefono>
  </cliente>
  <cliente> 
    <nome>BMW Italia S.p.A.</nome> 
    <email>info@bmw.it</email>
    <telefono>02 516 0323</telefono>
  </cliente>
  <cliente> 
    <nome>Ford Italia S.p.A.</nome> 
    <email>info@ford.it</email>
    <telefono>06 233 0123</telefono>
  </cliente>
</clienti>


Di seguito quindi, il codice necessario per importare questo file (clienti.xml) usando OdooRPC:

In [18]: import xml.etree.ElementTree as ET In [37]: tree = ET.parse('clienti.xml')
In [19]: root = tree.getroot()
In [20]: for cliente in root.findall('cliente'):
    ...: name = cliente.find('nome').text
    ...: email = cliente.find('email').text
    ...: phone = cliente.find('telefono').text
    ...: customer_data = {
    ...: 'name': name,
    ...: 'email': email,
    ...: 'phone': phone
    ...: }
    ...: new_partner = partner_model.create(customer_data)
    ...: print new_partner
    ...:     
50
51
52


ESPORTAZIONE daTI.

Dopo aver analizzato alcune procedure di importazione dati, ora vediamo l'esportazione di questi.

L'esportazione in formato CSV è sicuramente la più comune ed è quindi quella che affronteremo in questo tutorial.

In un prossimo capitolo affronteremo la scrittura in formati differenti, come XML e JSON soprattutto.


Analizziamo quindi estrazione di un file CSV con i dati dei clienti precedentemente importati:

In [18]: partner_ids = partner_model.search([('name', 'ilike', 'S.p.A.')])
In [19]: with open('estrazione_clienti.csv', 'wb') as csvfile:
    ...: writer = csv.writer(
    ...:         csvfile, delimiter=',', quotechar='"', quoting=csv.QUOTE_MINIMAL)
    ...: writer.writerow(['Nome', 'Email', 'Telefono'])
    ...: for partner in partner_model.browse(partner_ids):
    ...: name = partner.name
    ...: email = partner.email
    ...: phone = partner.phone
    ...: writer.writerow([name, email, phone])
    ...:         
In [20]:

Il contenuto del file estrazione_clienti.csv sarà quindi il seguente:

$ cat estrazione_clienti.csv 
Nome,Email,Telefono
BMW Italia S.p.A.,info@bmw.it,02 516 0323
FCA Italy S.p.A.,info@fca.it,011 986 5211
Ford Italia S.p.A.,info@ford.it,06 233 0123


Conclusioni.

Senza la pretesa di aver risposto a tutte le vostre domande con questa semplice guida, spero di aver fornito sufficienti informazioni per convincervi dell'efficacia di questa libreria.

Per ulteriori domande non esitate a lasciare commenti o a contattarmi direttamente.


Alla prossima puntata.