diff --git a/base_external_dbsource/__init__.py b/base_external_dbsource/__init__.py old mode 100755 new mode 100644 index 81d83fc8..3f4df04a --- a/base_external_dbsource/__init__.py +++ b/base_external_dbsource/__init__.py @@ -19,6 +19,6 @@ # ############################################################################## -import base_external_dbsource +from . import base_external_dbsource # vim:expandtab:smartindent:tabstop=4:softtabstop=4:shiftwidth=4: diff --git a/base_external_dbsource/__openerp__.py b/base_external_dbsource/__openerp__.py index f40b09a9..40af248e 100644 --- a/base_external_dbsource/__openerp__.py +++ b/base_external_dbsource/__openerp__.py @@ -1,7 +1,7 @@ # -*- coding: utf-8 -*- ############################################################################## # -# Daniel Reis, 2011 +# Daniel Reis, 2011 # Additional contributions by Maxime Chambreuil, Savoir-faire Linux # # This program is free software: you can redistribute it and/or modify @@ -21,20 +21,25 @@ { 'name': 'External Database Sources', - 'version': '61.3', + 'version': '1.3', 'category': 'Tools', 'description': """ This module allows you to define connections to foreign databases using ODBC, Oracle Client or SQLAlchemy. -Databases sources can be configured in Settings > Configuration -> Data sources. +Database sources can be configured in Settings > Configuration -> Data sources. Depending on the database, you need: * to install unixodbc and python-pyodbc packages to use ODBC connections. - * to install FreeTDS driver (tdsodbc package) and configure it through ODBC to + * to install FreeTDS driver (tdsodbc package) and configure it through ODBC to connect to Microsoft SQL Server. * to install and configure Oracle Instant Client and cx_Oracle python library to connect to Oracle. + +Contributors +============ + +* Maxime Chambreuil """, 'author': 'Daniel Reis', 'website': 'http://launchpad.net/addons-tko', @@ -44,7 +49,6 @@ Depending on the database, you need: 'depends': [ 'base', ], - 'init': [], 'data': [ 'base_external_dbsource_view.xml', 'security/ir.model.access.csv', @@ -54,7 +58,7 @@ Depending on the database, you need: ], 'test': [ 'dbsource_connect.yml', - ], + ], 'installable': True, 'active': False, } diff --git a/base_external_dbsource/base_external_dbsource.py b/base_external_dbsource/base_external_dbsource.py index 9aa21f05..e9e4e787 100644 --- a/base_external_dbsource/base_external_dbsource.py +++ b/base_external_dbsource/base_external_dbsource.py @@ -20,67 +20,73 @@ ############################################################################## import os -from osv import fields, osv +import logging +from openerp.osv import orm, fields from openerp.tools.translate import _ import openerp.tools as tools -import logging _logger = logging.getLogger(__name__) CONNECTORS = [] try: import sqlalchemy - import pymssql - CONNECTORS.append( ('mssql', 'Microsoft SQL Server') ) + CONNECTORS.append(('sqlite', 'SQLite')) + try: + import pymssql + CONNECTORS.append(('mssql', 'Microsoft SQL Server')) + except: + _logger.info('MS SQL Server not available. Please install "pymssql"\ + python package.') + try: + import MySQLdb + CONNECTORS.append(('mysql', 'MySQL')) + except: + _logger.info('MySQL not available. Please install "mysqldb"\ + python package.') except: - _logger.info('MS SQL Server not available. Please install "slqalchemy" and "pymssql" python package.') - -try: - import sqlalchemy - import MySQLdb - CONNECTORS.append( ('mysql', 'MySQL') ) -except: - _logger.info('MySQL not available. Please install "slqalchemy" and "mysqldb" python package.') - + _logger.info('SQL Alchemy not available. Please install "slqalchemy"\ + python package.') try: import pyodbc - CONNECTORS.append( ('pyodbc', 'ODBC') ) + CONNECTORS.append(('pyodbc', 'ODBC')) except: - _logger.info('ODBC libraries not available. Please install "unixodbc" and "python-pyodbc" packages.') + _logger.info('ODBC libraries not available. Please install "unixodbc"\ + and "python-pyodbc" packages.') try: import cx_Oracle - CONNECTORS.append( ('cx_Oracle', 'Oracle') ) + CONNECTORS.append(('cx_Oracle', 'Oracle')) except: - _logger.info('Oracle libraries not available. Please install "cx_Oracle" python package.') + _logger.info('Oracle libraries not available. Please install "cx_Oracle"\ + python package.') import psycopg2 -CONNECTORS.append( ('postgresql', 'PostgreSQL') ) +CONNECTORS.append(('postgresql', 'PostgreSQL')) -try: - import sqlalchemy - CONNECTORS.append( ('sqlite', 'SQLite') ) -except: - _logger.info('SQLAlchemy not available. Please install "slqalchemy" python package.') - -class base_external_dbsource(osv.osv): + +class base_external_dbsource(orm.Model): _name = "base.external.dbsource" _description = 'External Database Sources' _columns = { 'name': fields.char('Datasource name', required=True, size=64), - 'conn_string': fields.text('Connection string', help="""\ + 'conn_string': fields.text('Connection string', help=""" Sample connection strings: -- Microsoft SQL Server: mssql+pymssql://username:%s@server:port/dbname?charset=utf8 +- Microsoft SQL Server: + mssql+pymssql://username:%s@server:port/dbname?charset=utf8 - MySQL: mysql://user:%s@server:port/dbname - ODBC: DRIVER={FreeTDS};SERVER=server.address;Database=mydb;UID=sa - ORACLE: username/%s@//server.address:port/instance -- PostgreSQL: dbname='template1' user='dbuser' host='localhost' port='5432' password=%s +- PostgreSQL: + dbname='template1' user='dbuser' host='localhost' port='5432' password=%s - SQLite: sqlite:///test.db """), - 'password': fields.char('Password' , size=40), - 'connector': fields.selection(CONNECTORS, 'Connector', required=True, - help = "If a connector is missing from the list, check the " \ - + "server log to confirm that the required componentes were detected."), + 'password': fields.char('Password', size=40), + 'connector': fields.selection(CONNECTORS, 'Connector', + required=True, + help="If a connector is missing from the\ + list, check the server log to confirm\ + that the required components were\ + detected."), } def conn_open(self, cr, uid, id1): @@ -98,24 +104,28 @@ Sample connection strings: conn = cx_Oracle.connect(connStr) elif data.connector == 'pyodbc': conn = pyodbc.connect(connStr) - elif data.connector in ('sqlite','mysql','mssql'): + elif data.connector in ('sqlite', 'mysql', 'mssql'): conn = sqlalchemy.create_engine(connStr).connect() elif data.connector == 'postgresql': conn = psycopg2.connect(connStr) return conn - def execute(self, cr, uid, ids, sqlquery, sqlparams=None, metadata=False, context=None): - """Executes SQL and returns a list of rows. - - "sqlparams" can be a dict of values, that can be referenced in the SQL statement - using "%(key)s" or, in the case of Oracle, ":key". - Example: - sqlquery = "select * from mytable where city = %(city)s and date > %(dt)s" - params = {'city': 'Lisbon', 'dt': datetime.datetime(2000, 12, 31)} - - If metadata=True, it will instead return a dict containing the rows list and the columns list, - in the format: + def execute(self, cr, uid, ids, sqlquery, sqlparams=None, metadata=False, + context=None): + """Executes SQL and returns a list of rows. + + "sqlparams" can be a dict of values, that can be referenced in + the SQL statement using "%(key)s" or, in the case of Oracle, + ":key". + Example: + sqlquery = "select * from mytable where city = %(city)s and + date > %(dt)s" + params = {'city': 'Lisbon', + 'dt': datetime.datetime(2000, 12, 31)} + + If metadata=True, it will instead return a dict containing the + rows list and the columns list, in the format: { 'cols': [ 'col_a', 'col_b', ...] , 'rows': [ (a0, b0, ...), (a1, b1, ...), ...] } """ @@ -123,19 +133,21 @@ Sample connection strings: rows, cols = list(), list() for obj in data: conn = self.conn_open(cr, uid, obj.id) - if obj.connector in ["sqlite","mysql","mssql"]: + if obj.connector in ["sqlite", "mysql", "mssql"]: #using sqlalchemy cur = conn.execute(sqlquery, sqlparams) - if metadata: cols = cur.keys() + if metadata: + cols = cur.keys() rows = [r for r in cur] - else: + else: #using other db connectors cur = conn.cursor() cur.execute(sqlquery, sqlparams) - if metadata: cols = [d[0] for d in cur.description] + if metadata: + cols = [d[0] for d in cur.description] rows = cur.fetchall() conn.close() - if metadata: + if metadata: return{'cols': cols, 'rows': rows} else: return rows @@ -146,14 +158,18 @@ Sample connection strings: try: conn = self.conn_open(cr, uid, obj.id) except Exception, e: - raise osv.except_osv(_("Connection test failed!"), _("Here is what we got instead:\n %s") % tools.ustr(e)) + raise orm.except_orm(_("Connection test failed!"), + _("Here is what we got instead:\n %s") + % tools.ustr(e)) finally: try: - if conn: conn.close() + if conn: + conn.close() except Exception: # ignored, just a consequence of the previous exception pass #TODO: if OK a (wizard) message box should be displayed - raise osv.except_osv(_("Connection test succeeded!"), _("Everything seems properly set up!")) - -base_external_dbsource() + raise orm.except_orm(_("Connection test succeeded!"), + _("Everything seems properly set up!")) + +#EOF diff --git a/base_external_dbsource/base_external_dbsource_demo.xml b/base_external_dbsource/base_external_dbsource_demo.xml old mode 100755 new mode 100644 diff --git a/base_external_dbsource/base_external_dbsource_view.xml b/base_external_dbsource/base_external_dbsource_view.xml index 606bc726..df6ad85f 100644 --- a/base_external_dbsource/base_external_dbsource_view.xml +++ b/base_external_dbsource/base_external_dbsource_view.xml @@ -9,7 +9,7 @@ base.external.dbsource tree - + @@ -22,7 +22,7 @@ base.external.dbsource form -
+ @@ -45,7 +45,7 @@ diff --git a/base_external_dbsource/security/ir.model.access.csv b/base_external_dbsource/security/ir.model.access.csv old mode 100755 new mode 100644 diff --git a/base_external_dbsource/test/dbsource_connect.yml b/base_external_dbsource/test/dbsource_connect.yml old mode 100755 new mode 100644