Migrasi Data

Ada beberapa cara migrasi data di OpenERP. Biasanya melalui file XML atau CSV. Namun untuk cara yang lebih fleksibel bisa menggunakan script dimana ia berfungsi sebagai OpenERP client.

Pertama buatlah modulnya yang bernama openerp_client.py berikut ini.

import xmlrpclib
from types import ListType

class OpenERP:
def __init__(self, database='openerp', username='admin', password='admin',
model='', host='localhost', port=8069, login=True):
self.host = host
self.port = port
self.username = username
self.password = password
self.database = database
self.model = model
self.url_common = 'http://%s:%d/xmlrpc/common' % (host, port)
self.url_object = 'http://%s:%d/xmlrpc/object' % (host, port)
self.auth = xmlrpclib.ServerProxy(self.url_common)
self.obj = xmlrpclib.ServerProxy(self.url_object)
self.uid = login and self.login() or 0

def login(self):
self.uid = self.auth.login(self.database, self.username, self.password)
return self.uid

def search_pretty(self, args=[], model=''):
model = model or self.model
ids = self.obj.execute(self.database, self.uid, self.password, model,
'search', args)
if not ids:
return ids
return self.obj.execute(self.database, self.uid, self.password, model,
'read', ids)

def search(self, args=[], model=''):
rows = self.search_pretty(args, model)
if not rows:

return rows
# Field many2one selain memuat id juga memuat name. Hapus name-nya.
results = []
for fields in rows:
values = dict(fields)
for fieldname in fields:
value = fields[fieldname]
if type(value) == ListType:
if value:
values[fieldname] = value[0]
else:
del values[fieldname]
results.append(values)
return results

def create(self, values, model=''):
model = model or self.model
return self.obj.execute(self.database, self.uid, self.password, model,
'create', values)

def write(self, ids, values, model=''):
model = model or self.model
ids = type(ids) == ListType and ids or [ids]
return self.obj.execute(self.database, self.uid, self.password, model,
'write', ids, values)

def unlink(self, ids, model=''):
model = model or self.model
ids = type(ids) == ListType and ids or [ids]
return self.obj.execute(self.database, self.uid, self.password, model,
'unlink', ids)

if __name__ == '__main__':
erp = OpenERP(model='res.users')
# Tampilkan semua
for fields in erp.search():
print fields
# Ubah nama user admin jadi huruf besar
rows = erp.search([('login', '=', 'admin')])
fields = rows[0]
id = fields['id']
values = {'name': fields['name'].upper()}
print values
print erp.write(id, values)

Meski file ini berupa modul, tapi ia juga sudah dapat dijalankan untuk uji coba, dimana ia akan menjadikan nama user admin menjadi huruf besar semua.

Berikut ini script penggunaan modul tersebut dimana kita akan mengisi account.asset.category dari database lain.

import sys
import sqlalchemy as sa
from openerp_client import OpenERP
from types import ListType

url = 'mysql://root:a@localhost/simba'
engine = sa.create_engine(url)

erp = OpenERP('sid_asset', 'admin', 'a', 'account.asset.category')

# Dapatkan info dari salah satu record-nya sebagai contoh.
rows = erp.search()
if not rows:
sys.exit('Gagal: perlu contoh record %s.' % erp.model)

values = rows[0]

sql = "SELECT * FROM tblgol ORDER BY 1"
for r in engine.execute(sql):
values['name'] = r.namagol
rows = erp.search([('name', '=', r.namagol)])
if rows:
id = rows[0]['id']
print 'UPDATE', erp.write(id, values)
else:
print 'INSERT', erp.create(values)

Selamat mencoba.

Referensi: