Export de données de OpenERP / Odoo

Exemple de script python d’export d’un modèle particulier de données de OpenERP ou Odoo.
Pour lancer le script, il est nécessaire d’installer Python, ERPPeek et les modules python unicodecsv, json, getopt et sys

Il faut créer un fichier de configuration erppeek.ini contenant les paramètres de connexion à OpenERP.

Les script se lance alors de la façon suivante :

export-model.py -c 'openerp' -m 'res.partner'

pour ne pas exporter certains champs :

export-model.py -c 'openerp' -m 'res.partner' --removefields {'champ1','champ2'}

pour reprendre un export arrêté à l’enregistrement ‘n’, il suffit de lancer le script avec l’argument resume :

export-model.py --config 'openerp' --model 'res.partner' --resume n

L’export se fait dans un fichier csv du nom du modèle exporté. Le time out de la session http est géré par le script : ‘except socket.error:’

#!/bin/python

import unicodecsv as csv
import sys, erppeek, json, getopt
import socket
from socket import AF_INET, SOCK_DGRAM

def main(argv):
config = ''
model = ''
resume = 0
removefields = {}
index = 0

try:
opts, args = getopt.getopt(argv,"hc:m:r:",["config=","model="])
except getopt.GetoptError:
print 'list-models.py -c '
sys.exit(2)
for opt, arg in opts:
if opt == '-h':
print 'test.py -c '
sys.exit()
elif opt in ("-c", "--config"):
config = arg
elif opt in ("-m", "--model"):
model = arg
elif opt in ("-r", "--resume"):
resume = arg
elif opt in ("--removefields"):
removefields = arg

client = erppeek.Client.from_config(config)

modelcount = client.model(model).count([])
if modelcount > 0:
fieldnames = client.model(model).keys()
first_element = client.model(model).search()[0]
odoo_data = client.model(model).read([first_element], fieldnames)

# recuperation des cles pour creer les en-tetes du fichier csv
keys = odoo_data[0].keys()
for r in removefields:
keys.remove(r)
if resume is False:
with open(model+'.csv', 'wb') as output_file:
dict_writer = csv.DictWriter(output_file, keys)
dict_writer.writeheader()
else:
print resume

for i in client.model(model).search()[int(resume):]:
try:
odoo_data = client.model(model).read([i], keys)
print client.model(model).read([i], ['id','create_date'])
with open(model+'.csv', 'a+') as output_file:
dict_writer = csv.DictWriter(output_file, keys)
dict_writer.writerows(odoo_data)
index +=1

except socket.error:
client = erppeek.Client.from_config(config)
continue
except (KeyboardInterrupt, EOFError) as err:
print "User interruption, resume from:"+str(index)
quit(0)
except as err:
print (err)
print(err.args)
print "Fatal error, fix it and resume from: "+str(index)
quit(0)

print client.model(model).count([]), model

if __name__ == "__main__":
main(sys.argv[1:])

Publié dans Non classé.

Laisser un commentaire

Votre adresse de messagerie ne sera pas publiée. Les champs obligatoires sont indiqués avec *