Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

How to write a Python script that uses the OpenERP ORM to directly upload to Postgres Database

Tags:

openerp

I need to write a "standalone" script in Python to upload sales taxes to the account_tax table in the database using ONLY the ORM module of OpenERP. What I would like to do is something like the pseudo code below.

Can someone provide me a more details on the following: 1) what sys.path's do I need to set 2) what modules do I need to import before importing the "account" module. Currently when I import the "account" module I get the following error: AssertionError: The report "report.custom" already exists! 3) What is the proper way to get my database cursor. In the code below I am simply calling psycopg2 directly to get a cursor.

If this approach cannot work, can anyone suggest an alternative approach other than writing XML files to load the data from the OpenERP application itself. This process needs to run outside of the the standard OpenERP application.

PSEUDO CODE:

import sys
# set Python paths to access openerp modules
sys.path.append("./openerp")
sys.path.append("./openerp/addons")

# import OpenERP 
import openerp

# import the account addon modules that contains the tables 
# to be populated.
import account

# define connection string
conn_string2 = "dbname='test2' user='xyz' password='password'"

# get a db connection
conn = psycopg2.connect(conn_string2)

# conn.cursor() will return a cursor object
cursor = conn.cursor()

# and finally use the ORM to insert data into table.
like image 200
Tim Young Avatar asked Jul 15 '12 16:07

Tim Young


4 Answers

If you wanna do it via web service then have look at the OpenERP XML-RPC Web services

Example code top work with OpenERP Web Services :

import xmlrpclib

username = 'admin' #the user
pwd = 'admin'      #the password of the user
dbname = 'test'    #the database

# OpenERP Common login Service proxy object 
sock_common = xmlrpclib.ServerProxy ('http://localhost:8069/xmlrpc/common')
uid = sock_common.login(dbname, username, pwd)

#replace localhost with the address of the server
# OpenERP Object manipulation service 
sock = xmlrpclib.ServerProxy('http://localhost:8069/xmlrpc/object')

partner = {
   'name': 'Fabien Pinckaers',
   'lang': 'fr_FR',
}
#calling remote ORM create method to create a record 
partner_id = sock.execute(dbname, uid, pwd, 'res.partner', 'create', partner)

More clearly you can also use the OpenERP Client lib Example Code with client lib :

import openerplib

connection = openerplib.get_connection(hostname="localhost", database="test", \
    login="admin", password="admin")
user_model = connection.get_model("res.users")
ids = user_model.search([("login", "=", "admin")])
user_info = user_model.read(ids[0], ["name"])
print user_info["name"]

You see both way are good but when you use the client lib, code is less and easy to understand while using xmlrpc proxy is lower level calls that you will handle Hope this will help you.

like image 188
ifixthat Avatar answered Oct 21 '22 18:10

ifixthat


As per my view one must go for XMLRPC or NETSVC services provided by Open ERP for such needs.

You don't need to import accounts module of Open ERP, there are possibilities that other modules have inherited accounts.tax object and had altered its behaviour as per your business needs.

Eventually if you feed data by calling those methods manually without using Open ERP Web service its possible you'll get undesired result / unexpected failures / inconsistent database state.

like image 21
shahjapan Avatar answered Oct 21 '22 18:10

shahjapan


You can use Erppeek to browse data, but not sure if you can really upload data to DB, personally I use/prefer XMLRPC

like image 30
Ashok Kumar Sahoo Avatar answered Oct 21 '22 19:10

Ashok Kumar Sahoo


Why don't you use the xmlrpc call of openerp. it will not need to import account or openerp . and even you can have all orm functionality.

like image 1
Ruchir Shukla Avatar answered Oct 21 '22 17:10

Ruchir Shukla