2012-07-15 8 views
9

Necesito escribir un script "independiente" en Python para cargar impuestos a la tabla account_tax en la base de datos utilizando SOLAMENTE el módulo ORM de OpenERP. Lo que me gustaría hacer es algo así como el pseudo código a continuación.Cómo escribir un script de Python que use el ORM de OpenERP para cargarlo directamente en la base de datos de Postgres

Puede alguien proporcionar un más detalles sobre lo siguiente: 1) lo sys.path de qué necesito para establecer 2) qué módulos necesito para importar antes de importar el módulo de "cuenta". Actualmente, cuando importo el módulo "cuenta", aparece el siguiente error: AssertionError: ¡ya existe el informe "report.custom"! 3) ¿Cuál es la forma correcta de obtener el cursor de mi base de datos? En el siguiente código, simplemente estoy llamando a psycopg2 directamente para obtener un cursor.

Si este enfoque no puede funcionar, ¿alguien puede sugerir un enfoque alternativo que no sea escribir archivos XML para cargar los datos de la aplicación OpenERP en sí misma. Este proceso debe ejecutarse fuera de la aplicación estándar de OpenERP.

PSEUDO CÓDIGO:

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. 
+0

hi Tim que desea utilizar solamente ORM como módulo o que quieren OE servicio a insertar datos sin usar la interfaz de usuario ??? –

Respuesta

1

Por qué no usas la llamada xmlrpc de OpenERP. no será necesario importar la cuenta ni abrir el archivo. e incluso puedes tener toda la funcionalidad de orm.

18

Si quieres hacerlo a través del servicio web a continuación, tienen un aspecto en el OpenERP XML-RPC Web services

Ejemplo de trabajo superior de código con los servicios web de OpenERP:

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) 

Más claramente que también se puede utilizar el OpenERP Client lib Ejemplo de código con cliente 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"] 

Las dos maneras son buenas, pero cuando se utiliza el cliente l ib, el código es menos y fácil de entender mientras se usa el proxy xmlrpc es llamadas de nivel inferior que manejará Espero que esto lo ayude.

+0

Gracias por la ayuda. Al usar openerplib, ¿hay alguna forma de consultar la base de datos con sentencias SQL sencillas? Si es así, ¿hay alguna forma de obtener el cursor de la base de datos en el que ejecutar la consulta SQL? –

+1

Hola, Tim usando algún servicio web no se puede llamar directamente al disparador sql, pero su siempre está fuera. En algunos modelos, usted escribe la función con disparadores sql y luego, usando el servicio de modelo, puede activar esa función que desencadena el sql. –

+0

¿Cómo puedo averiguar el nombre de la base de datos? – guaka

1

Según mi punto de vista uno debe ir por los servicios XMLRPC o NETSVC proporcionados por Open ERP para tales necesidades.

No es necesario importar el módulo accounts de Open ERP, existen posibilidades de que otros módulos hayan heredado el objeto accounts.tax y hayan alterado su comportamiento según las necesidades de su empresa.

Eventualmente, si alimenta datos llamando a esos métodos manualmente sin utilizar Open ERP Web service es posible que obtenga un resultado no deseado/fallas inesperadas/estado inconsistente de la base de datos.

1

Puede utilizar Erppeek para navegar por los datos, pero no está seguro de si realmente se puede cargar datos en DB, personalmente utilizo/XMLRPC prefieren

0

Si desea interacti directamente con la base de datos, sólo podría psycopg2 importación y:

conn = psycopg2.connect(dbname='dbname', user='dbuser', password='dbpassword', host='dbhost') 
cur = conn.cursor() 
cur.execute('select * from table where id = %d' % table_id) 
cur.execute('insert into table(column1, column2) values(%d, %d)' % (value1, value2)) 
cur.close() 
conn.close() 
0

por qué quiere fijarlo así ?! Debe crear un módulo de localización y definir datos en archivos XML. Esta es la forma estándar de solucionar ese problema en OpenERP.

¿Desea insertar los impuestos sobre las ventas de qué país? Explicar más porfavor

-1

de RegistryManager importación openerp.modules.registry
registro = RegistryManager.get ("databasename")
con registry.cursor() como cr:
          user = registry.get ('res .Los usuarios). examinar (cr, ID de usuario, listids)
          usuario de impresión

Cuestiones relacionadas