2012-07-15 5 views
9

Ho bisogno di scrivere uno script "standalone" in Python per caricare le tasse sulle vendite nella tabella account_tax nel database usando SOLO il modulo ORM di OpenERP. Quello che mi piacerebbe fare è qualcosa di simile allo pseudo codice qui sotto.Come scrivere uno script Python che utilizza OpenERP ORM per caricare direttamente nel database Postgres

Qualcuno mi può fornire una più dettagliatamente gli aspetti seguenti: 1) quello di sys.path devo impostare 2) quali moduli ho bisogno di importare prima di importare il modulo "conto". Attualmente quando impongo il modulo "account" ottengo il seguente errore: AssertionError: il report "report.custom" esiste già! 3) Qual è il modo corretto per ottenere il cursore del mio database. Nel codice qui sotto sto semplicemente chiamando psycopg2 direttamente per ottenere un cursore.

Se questo approccio non può funzionare, chiunque può suggerire un approccio alternativo diverso dalla scrittura di file XML per caricare i dati dall'applicazione OpenERP stessa. Questo processo deve essere eseguito al di fuori dell'applicazione OpenERP standard.

pseudo codice:

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 che si desidera utilizzare solo ORM come modulo o si desidera OE servizio di inserire dati senza utilizzare l'interfaccia utente ??? –

risposta

1

Perché non si usa la chiamata XMLRPC di OpenERP. non avrà bisogno di importare account o openerp. e anche tu puoi avere tutte le funzionalità di orm.

18

Se vuoi fare tramite web service poi un'occhiata alla OpenERP XML-RPC Web services

esempio di codice piano di lavoro con 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) 

Più chiaramente si può anche utilizzare il OpenERP Client lib Esempio di codice 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"] 

vedete sia modo sono buone, ma quando si utilizza il client l ib, il codice è meno facile da capire mentre si utilizza il proxy xmlrpc le chiamate di livello inferiore che gestirai Spero che questo ti sia di aiuto.

+0

Grazie per l'aiuto. Nell'usare openerplib, c'è un modo per interrogare il database con semplici istruzioni SQL? In tal caso, c'è un modo per ottenere il cursore del database su cui eseguire la query SQL? –

+1

Ciao, Tim utilizzando un servizio web non è possibile chiamare direttamente il trigger sql, ma è sempre uscito. In alcuni modelli si scrive la funzione con i trigger SQL e quindi si utilizza il servizio modello per attivare la funzione che attiva lo sql. –

+0

Come trovare il nome del database? – guaka

1

Come per la mia vista si deve andare per XMLRPC o NETSVC servizi forniti da Open ERP per tali esigenze.

Non è necessario importare il modulo accounts di Open ERP, ci sono possibilità che altri moduli abbiano ereditato l'oggetto accounts.tax e abbiano alterato il proprio comportamento in base alle proprie esigenze aziendali.

Infine, se si alimentano i dati chiamando questi metodi manualmente senza utilizzare Open ERP Web service, è possibile ottenere risultati indesiderati/errori imprevisti/stato del database incoerente.

1

È possibile utilizzare Erppeek per sfogliare i dati, ma non è sicuro se si può davvero caricare i dati di DB, personalmente utilizzo/preferire XMLRPC

0

Se si desidera interacti direttamente con DB, si può solo importazione psycopg2 e:

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

perché si vuole risolvere il problema del genere ?! È necessario creare un modulo di localizzazione e definire i dati nei file XML . Questo è il modo standard per risolvere questo problema in OpenERP.

Si desidera inserire le imposte sulle vendite per quale paese? Spiega di più

-1

da openerp.modules.registry importazione RegistryManager
di registro = RegistryManager.get ("nomedatabase")
con registry.cursor() come cr:
          user = registry.get ('res .users'). Browse (cr, userid, listids)
          utente stampa

Problemi correlati