Dopo l'installazione del sistema, importare i propri dati è spesso il passo successivo. Vediamo come semplificarci la vita utilizzando ERPPeek.

Odoo, importare ed esportare dati con ERPPeek

Dopo l'installazione del sistema, importare i propri dati è spesso il passo successivo. Vediamo come semplificarci la vita utilizzando ERPPeek.

ERPPeek è una libreria Python che permette la comunicazione con la propria istanza Odoo tramite il protocollo XML-RPC.

In questo articolo vedremo insieme come:

  • installare ERPPeek correttamente,
  • leggere e scrivere dati nel DB Odoo,
  • importare dati in Odoo tramite file CSV o XML

Installare ERPPeek

Essendo una libreria Python presente su PyPi, ERPPeek può essere installato ad esempio con PIP con il seguente comando:

sudo pip install erppeek

Se usate OSX e avete installato Python tramite HomeBrew, omettete sudo, dato che tutta l'installazione Python è in user-space e non avete bisogno dei permessi di root.

Verificare la corretta installazione di ERPPeek

Se non avete avuto problemi con l'installazione potete testare il modulo importandolo in un terminale Python:

>>> import erppeek
>>> 

Per poi aprire una connessione ad un'istanza Odoo (qualsiasi versione, anche vecchie installazioni di OpenERP):

>>> client = erppeek.Client('http://localhost:8069', db='demo', user='admin', password='admin')
>>> client
<Client 'http://localhost:8069#demo'>
>>>

Ovviamente dovrete cambiare indirizzo, db, user e password in base alle vostre esigenze.

Se tutto è andato per il verso giusto, potrete usare l'oggetto client come proxy per accedere al vostro database Odoo.

Nel caso in cui otteniate errori e pensiate che questi possano dipendere da errori di installazione di Odoo, vi invito a leggere quest'altro articolo riguardante l'installazione e la prima configurazione di Odoo.

Leggere e scrivere dati tramite ERPPeek e le API Odoo

Ora che abbiamo "stabilito il contatto", vediamo come usare ERPPeek per estrarre dati da Odoo.

>>> client.ResPartner
<Model 'res.partner'>
>>> client.ResPartner.browse(10)
<Record 'res.partner,10'>
>>> client.ResPartner.browse(10).name
'Epic Technologies'
>>> client.ResPartner.browse(10).country_id
<Record 'res.country,235'>
>>> client.ResPartner.browse(10).country_id.name
'United States'
>>> 

Come potete vedere nell'esempio, accedere alle API dell'ORM di Odoo è semplice e per nulla prolisso.

Potete sostituire ovviamente ResPartner con qualsiasi model presente sulla vostra installazione di Odoo.

La sintassi è piuttosto intuitiva: se il modello è res.partner, in ERPPeek diventa ResPartner.

Possiamo accedere all'elenco dei model disponibili con:

>>> client.models()
[...]
>>> 'PurchaseOrderLine': <Model 'purchase.order.line'>}
>>> 

Possiamo quindi testare altri metodi dell'ORM di Odoo, come search e read:

>>> client.ResPartner.browse(10).name
'Epic Technologies'
>>> client.ResPartner.search([('name', '=', 'Epic Technologies')])
[10]
>>> client.ResPartner.read(10)['name']
'Epic Technologies'
>>>

Come vedete possiamo usare la sintassi dei domains Odoo con il metodo search e quindi è possibile riutilizzare eventuali stringhe di ricerca già presenti in Odoo.

Se dobbiamo importare dati in Odoo ci servirà anche il metodo create:

>>> client.ResPartner.create({'name': 'Acme Spa'})
<Record 'res.partner,74'>
>>> client.ResPartner.browse(74).name
'Acme Spa'
>>>

Anche in questo caso, la sintassi dei parametri di create è la stessa di Odoo, quindi potremo in molti casi riciclare codice esistente.

La ultima menzione va al metodo write, che esiste anche in ERPPeek e segue le stesse regole.

Ma possiamo evitare di usarlo esplicitamente, dato che ERPPeek interpreta correttamente la seguente sintassi:

>>> client.ResPartner.browse(10).email = 'hello@partner.com'

Importare in Odoo dati da sorgenti esterne

L'obiettivo di questo tutorial era l'importazione di dati in Odoo che è spesso una delle necessità primarie per chi inizia un nuovo progetto.

Prendiamo in considerazione due casi semplici: dati su foglio di calcolo (XLS, CSV) oppure su file XML.

Il primo caso è molto comune se stiamo importando dati da gestionali precedenti; XML è spesso usato per dati strutturati eventualmente estrapolati da software moderni.

Import da CSV

È possibile partire da documenti in formato MS Excel, ma è sempre molto consigliato convertire i documenti in formato CSV.

Consideriamo quindi un file CSV (aziende.csv) strutturato in questo modo e separato da virgole:

Ragione SocialeEmail
Acme Spa hello@acmespa.com
OtherCompany srl info@othercompany.com

Possiamo immaginare una semplice procedura di importazione strutturata in questo modo:

>>> import erppeek
>>> import csv
>>> client = erppeek.Client('http://localhost:8069', db='demo', user='admin', password='admin')
>>> with open('aziende.csv', 'rb') as csvfile:
...     reader = csv.DictReader(csvfile, delimiter=',', quotechar='"')
...     for row in reader:
...         new_partner_data = {
...             'name': row['Ragione Sociale'],
...             'email': row['Email'],
...             }
...         new_partner = client.ResPartner.create(new_partner_data)
... 
>>> 

Nel nostro esempio abbiamo fatto uso del modulo csv presente nella libreria standard di Python. L'import da documenti in formato MS Excel avrebbe invece richiesto l'utilizzo di moduli di terze parti.

Abbiamo usato DictReader di csv che ci ha fornito un elemento iterabile che si comporta come dizionario, quindi i campi delle nostre righe CSV sono richiamabili tramite il nome della colonna, ovvero quanto presente nella prima riga del CSV.

Utilizzando invece csv.reader al posto di csv.DictReader avremmo ottenuto un elemento ancora iterabile, ma che ci avrebbe obbligato a richiamare i nostri dati in base alla posizione.

Vediamo un esempio:

>>> with open('aziende.csv', 'rb') as csvfile:
...     reader = csv.reader(csvfile, delimiter=',', quotechar='"')
...     for row in reader:
...         print row
... 
['Ragione Sociale', 'Email']
['Acme Spa', 'hello@acmespa.com']
['OtherCompany srl', 'info@othercompany.com']
>>>

Import da XML

Vediamo ora l'importazione dati da file XML, prendendo come esempio un file XML semplice come il seguente:

<?xml version="1.0"?>
<aziende>
  <azienda> 
    <ragionesociale>Acme Spa</ragionesociale> 
    <email>hello@acmespa.com</email> 
  </azienda>
  <azienda> 
    <ragionesociale>OtherCompany srl</ragionesociale> 
    <email>info@othercompany.com</email> 
  </azienda> 
</aziende>

Esistono diversi Parser XML, ovvero librerie Python per la manipolazione di file XML. In questo esempio utilizziamo ElementTree, presente nella libreria standard, ma potrete facilmente adattare l'esempio ad altre librerie come lxml.

Vediamo una possibile procedura per il parsing del nostro file XML (aziende.xml):

>>> import xml.etree.ElementTree as ET
>>> tree = ET.parse('aziende.xml')
>>> root = tree.getroot()
>>> root
<Element 'aziende' at 0x10b1cca50>
>>> for azienda in root.findall('azienda'):
...    name = azienda.find('ragionesociale').text
...    email = azienda.find('email').text
...    new_partner_data = {'name': name, 'email': email}
...    print new_partner_data
... 
{'name': 'Acme Spa', 'email': 'hello@acmespa.com'}
{'name': 'OtherCompany srl', 'email': 'info@othercompany.com'}
>>> 

Semplice anche in questo caso no?

Conclusioni

Abbiamo mostrato brevemente come realizzare le operazioni di import dati, ma con lo stesso strumento potete anche esportare dati con facilità.

ERPPeek non è l'unica libreria di questo tipo presente in rete: potete ad esempio testare oerplib o simili e adottare quella che più si adatta al vostro stile.

In futuro avremo possibilità di approfondire l'importazione di dati da altre sorgenti, come database relazionali o webservices di altra natura, ma per il momento potete divertirvi ad importare i vostri dati legacy in Odoo senza impazzire con base_import, ovvero lo strumento integrato in Odoo per l'import da CSV.

Alla prossima puntata.

Share this on

Share |

On same topics

Commenti

comments powered by Disqus