From 0cb53890df64672f436b45762427b28b74bb8392 Mon Sep 17 00:00:00 2001 From: Vo Minh Thu Date: Fri, 22 Feb 2013 10:34:28 +0100 Subject: [PATCH 01/34] [IMP] report: reports with custom parsers can be declared in XML files. bzr revid: vmt@openerp.com-20130222093428-f1isxxqlbaj7uhuo --- openerp/addons/base/ir/ir_actions.py | 4 ++++ openerp/import_xml.rng | 1 + openerp/netsvc.py | 29 ++++++++++++++++++++++++++-- openerp/report/interface.py | 20 ++++++++++++------- openerp/report/print_xml.py | 2 +- openerp/report/report_sxw.py | 4 ++-- openerp/service/report.py | 2 +- openerp/tools/convert.py | 2 ++ openerp/tools/test_reports.py | 2 +- 9 files changed, 52 insertions(+), 14 deletions(-) diff --git a/openerp/addons/base/ir/ir_actions.py b/openerp/addons/base/ir/ir_actions.py index beb4e27200a..4f3ed8b0387 100644 --- a/openerp/addons/base/ir/ir_actions.py +++ b/openerp/addons/base/ir/ir_actions.py @@ -96,8 +96,11 @@ class report_xml(osv.osv): result = cr.dictfetchall() reports = openerp.report.interface.report_int._reports for r in result: + print ">>> Registering:", r['report_name'], "...", if reports.has_key('report.'+r['report_name']): + print " Already present." continue + print " Done." if r['report_rml'] or r['report_rml_content_data']: report_sxw('report.'+r['report_name'], r['model'], opj('addons',r['report_rml'] or '/'), header=r['header']) @@ -140,6 +143,7 @@ class report_xml(osv.osv): 'report_sxw_content': fields.function(_report_content, fnct_inv=_report_content_inv, type='binary', string='SXW Content',), 'report_rml_content': fields.function(_report_content, fnct_inv=_report_content_inv, type='binary', string='RML Content'), + 'parser': fields.char('Parser Class'), } _defaults = { 'type': 'ir.actions.report.xml', diff --git a/openerp/import_xml.rng b/openerp/import_xml.rng index 97b2c4a13c0..5f4c40b65d3 100644 --- a/openerp/import_xml.rng +++ b/openerp/import_xml.rng @@ -107,6 +107,7 @@ + diff --git a/openerp/netsvc.py b/openerp/netsvc.py index a5e33ff22b1..33d7a222884 100644 --- a/openerp/netsvc.py +++ b/openerp/netsvc.py @@ -24,6 +24,7 @@ import errno import logging import logging.handlers +import operator import os import platform import release @@ -45,13 +46,37 @@ import openerp _logger = logging.getLogger(__name__) -def LocalService(name): +def LocalService(name, cursor=None): # Special case for addons support, will be removed in a few days when addons # are updated to directly use openerp.osv.osv.service. if name == 'workflow': return openerp.workflow - return openerp.report.interface.report_int._reports[name] + if cursor is None: # TODO temporary, while refactoring + registered_report = openerp.report.interface.report_int._reports[name] + print ">>> Oh noes no cursor." + return registered_report + else: + from openerp.report.report_sxw import report_sxw, report_rml + cr = cursor + opj = os.path.join + cr.execute("SELECT * FROM ir_act_report_xml WHERE report_name=%s", (name[len('report.'):],)) + result = cr.dictfetchall() + for r in result: + if r['report_rml'] or r['report_rml_content_data']: + if r['parser']: + kwargs = { 'parser': operator.attrgetter(r['parser'])(openerp.addons) } + else: + kwargs = {} + new_report = report_sxw('report.'+r['report_name'], r['model'], + opj('addons',r['report_rml'] or '/'), header=r['header'], register=False, **kwargs) + elif r['report_xsl']: + new_report = report_rml('report.'+r['report_name'], r['model'], + opj('addons',r['report_xml']), + r['report_xsl'] and opj('addons',r['report_xsl']), register=False) + else: + raise Exception, "Unhandled report type: %s" % r + return new_report BLACK, RED, GREEN, YELLOW, BLUE, MAGENTA, CYAN, WHITE, _NOTHING, DEFAULT = range(10) #The background is set with 40 plus the number of the color, and the foreground with 30 diff --git a/openerp/report/interface.py b/openerp/report/interface.py index f0de9631800..6c5fc24b559 100644 --- a/openerp/report/interface.py +++ b/openerp/report/interface.py @@ -43,11 +43,17 @@ class report_int(object): _reports = {} - def __init__(self, name): - if not name.startswith('report.'): - raise Exception('ConceptionError, bad report name, should start with "report."') - assert name not in self._reports, 'The report "%s" already exists!' % name - self._reports[name] = self + def __init__(self, name, register=True): + if register: + print "*** Registering report `%s` but it should be registered trough data declaration instead. ***" % name + if not name.startswith('report.'): + raise Exception('ConceptionError, bad report name, should start with "report."') + assert name not in self._reports, 'The report "%s" already exists!' % name + self._reports[name] = self + else: + # The report is instanciated at each use site, which is ok. + pass + self.__name = name self.name = name @@ -65,8 +71,8 @@ class report_rml(report_int): XML -> DATAS -> RML -> PDF -> HTML using a XSL:RML transformation """ - def __init__(self, name, table, tmpl, xsl): - super(report_rml, self).__init__(name) + def __init__(self, name, table, tmpl, xsl, register=True): + super(report_rml, self).__init__(name, register=register) self.table = table self.internal_header=False self.tmpl = tmpl diff --git a/openerp/report/print_xml.py b/openerp/report/print_xml.py index c2af0984c2e..558f7dd3bd0 100644 --- a/openerp/report/print_xml.py +++ b/openerp/report/print_xml.py @@ -264,7 +264,7 @@ class document(object): def parse_tree(self, ids, model, context=None): if not context: context={} - browser = self.pool.get(model).browse(self.cr, self.uid, ids, context) + browser = self.pool[model].browse(self.cr, self.uid, ids, context) self.parse_node(self.dom, self.doc, browser) def parse_string(self, xml, ids, model, context=None): diff --git a/openerp/report/report_sxw.py b/openerp/report/report_sxw.py index 325690205ef..0e2a7e18edd 100644 --- a/openerp/report/report_sxw.py +++ b/openerp/report/report_sxw.py @@ -388,8 +388,8 @@ class rml_parse(object): self.setCompany(objects[0].company_id) class report_sxw(report_rml, preprocess.report): - def __init__(self, name, table, rml=False, parser=rml_parse, header='external', store=False): - report_rml.__init__(self, name, table, rml, '') + def __init__(self, name, table, rml=False, parser=rml_parse, header='external', store=False, register=True): + report_rml.__init__(self, name, table, rml, '', register=register) self.name = name self.parser = parser self.header = header diff --git a/openerp/service/report.py b/openerp/service/report.py index c20c7f0d7ec..d7832dfb40b 100644 --- a/openerp/service/report.py +++ b/openerp/service/report.py @@ -90,7 +90,7 @@ def exp_report(db, uid, object, ids, datas=None, context=None): def go(id, uid, ids, datas, context): cr = openerp.pooler.get_db(db).cursor() try: - obj = openerp.netsvc.LocalService('report.'+object) + obj = openerp.netsvc.LocalService('report.'+object, cursor=cr) (result, format) = obj.create(cr, uid, ids, datas, context) if not result: tb = sys.exc_info() diff --git a/openerp/tools/convert.py b/openerp/tools/convert.py index 00b8bf96340..a8ba37e29d5 100644 --- a/openerp/tools/convert.py +++ b/openerp/tools/convert.py @@ -302,6 +302,8 @@ form: module.record_id""" % (xml_id,) res['header'] = eval(rec.get('header','False')) if rec.get('report_type'): res['report_type'] = rec.get('report_type') + if rec.get('parser'): + res['parser'] = rec.get('parser') res['multi'] = rec.get('multi') and eval(rec.get('multi','False')) diff --git a/openerp/tools/test_reports.py b/openerp/tools/test_reports.py index 9ec4dab6cc3..71cedc1a98d 100644 --- a/openerp/tools/test_reports.py +++ b/openerp/tools/test_reports.py @@ -50,7 +50,7 @@ def try_report(cr, uid, rname, ids, data=None, context=None, our_module=None): else: rname_s = rname _logger.log(netsvc.logging.TEST, " - Trying %s.create(%r)", rname, ids) - res = netsvc.LocalService(rname).create(cr, uid, ids, data, context) + res = netsvc.LocalService(rname, cursor=cr).create(cr, uid, ids, data, context) if not isinstance(res, tuple): raise RuntimeError("Result of %s.create() should be a (data,format) tuple, now it is a %s" % \ (rname, type(res))) From 729d969fd9b0dcc7c7d25cc50acfbd45fc612f30 Mon Sep 17 00:00:00 2001 From: Vo Minh Thu Date: Fri, 22 Feb 2013 13:48:01 +0100 Subject: [PATCH 02/34] [IMP] report: use openerp.report.render_report() instead of LocalService().create(). bzr revid: vmt@openerp.com-20130222124801-zhhbw2bgghhf6rg6 --- doc/changelog.rst | 2 ++ openerp/addons/base/ir/ir_actions.py | 33 +++++++++++++++++++++++++++ openerp/addons/base/ir/ir_actions.xml | 1 + openerp/netsvc.py | 33 +++------------------------ openerp/report/__init__.py | 9 ++++++++ openerp/service/report.py | 7 +++--- openerp/tools/test_reports.py | 3 ++- 7 files changed, 53 insertions(+), 35 deletions(-) diff --git a/doc/changelog.rst b/doc/changelog.rst index a80e8dc6c8d..ec75fadfe6b 100644 --- a/doc/changelog.rst +++ b/doc/changelog.rst @@ -6,6 +6,8 @@ Changelog `trunk` ------- +- Almost removed ``LocalService()``. For reports, + ``openerp.report.render_report()`` can be used. - Added the :ref:`Long polling ` worker type. - Added :ref:`orm-workflows` to the ORM. - Added :ref:`routing-decorators` to the RPC and WSGI stack. diff --git a/openerp/addons/base/ir/ir_actions.py b/openerp/addons/base/ir/ir_actions.py index 4f3ed8b0387..71170f42e91 100644 --- a/openerp/addons/base/ir/ir_actions.py +++ b/openerp/addons/base/ir/ir_actions.py @@ -109,6 +109,39 @@ class report_xml(osv.osv): opj('addons',r['report_xml']), r['report_xsl'] and opj('addons',r['report_xsl'])) + def render_report(self, cr, uid, ids, name, data, context=None): + """ + Look up a report definition and render the report for the provided IDs. + """ + import openerp + import operator + import os + opj = os.path.join + + cr.execute("SELECT * FROM ir_act_report_xml WHERE report_name=%s", (name,)) + new_report = None + for r in cr.dictfetchall(): + if r['report_rml'] or r['report_rml_content_data']: + if r['parser']: + kwargs = { 'parser': operator.attrgetter(r['parser'])(openerp.addons) } + else: + kwargs = {} + new_report = report_sxw('report.'+r['report_name'], r['model'], + opj('addons',r['report_rml'] or '/'), header=r['header'], register=False, **kwargs) + elif r['report_xsl']: + new_report = report_rml('report.'+r['report_name'], r['model'], + opj('addons',r['report_xml']), + r['report_xsl'] and opj('addons',r['report_xsl']), register=False) + else: + # TODO: + # Temporarily, we look reports up the _reports dict. + # raise Exception, "Unhandled report type: %s" % r + pass + if new_report is None: + new_report = interface.report_int._reports['report.' + name] + + return new_report.create(cr, uid, ids, data, context) + _name = 'ir.actions.report.xml' _inherit = 'ir.actions.actions' _table = 'ir_act_report_xml' diff --git a/openerp/addons/base/ir/ir_actions.xml b/openerp/addons/base/ir/ir_actions.xml index da118129932..82514692c06 100644 --- a/openerp/addons/base/ir/ir_actions.xml +++ b/openerp/addons/base/ir/ir_actions.xml @@ -82,6 +82,7 @@ + diff --git a/openerp/netsvc.py b/openerp/netsvc.py index 33d7a222884..aab166ab4c2 100644 --- a/openerp/netsvc.py +++ b/openerp/netsvc.py @@ -46,37 +46,10 @@ import openerp _logger = logging.getLogger(__name__) +# TODO LocalService is deprecated. def LocalService(name, cursor=None): - # Special case for addons support, will be removed in a few days when addons - # are updated to directly use openerp.osv.osv.service. - if name == 'workflow': - return openerp.workflow - - if cursor is None: # TODO temporary, while refactoring - registered_report = openerp.report.interface.report_int._reports[name] - print ">>> Oh noes no cursor." - return registered_report - else: - from openerp.report.report_sxw import report_sxw, report_rml - cr = cursor - opj = os.path.join - cr.execute("SELECT * FROM ir_act_report_xml WHERE report_name=%s", (name[len('report.'):],)) - result = cr.dictfetchall() - for r in result: - if r['report_rml'] or r['report_rml_content_data']: - if r['parser']: - kwargs = { 'parser': operator.attrgetter(r['parser'])(openerp.addons) } - else: - kwargs = {} - new_report = report_sxw('report.'+r['report_name'], r['model'], - opj('addons',r['report_rml'] or '/'), header=r['header'], register=False, **kwargs) - elif r['report_xsl']: - new_report = report_rml('report.'+r['report_name'], r['model'], - opj('addons',r['report_xml']), - r['report_xsl'] and opj('addons',r['report_xsl']), register=False) - else: - raise Exception, "Unhandled report type: %s" % r - return new_report + assert name == 'workflow' + return openerp.workflow BLACK, RED, GREEN, YELLOW, BLUE, MAGENTA, CYAN, WHITE, _NOTHING, DEFAULT = range(10) #The background is set with 40 plus the number of the color, and the foreground with 30 diff --git a/openerp/report/__init__.py b/openerp/report/__init__.py index 6b56f15b6b5..647e6ba93a6 100644 --- a/openerp/report/__init__.py +++ b/openerp/report/__init__.py @@ -31,5 +31,14 @@ import report_sxw import printscreen +def render_report(cr, uid, ids, name, data, context=None): + """ + Helper to call ``ir.actions.report.xml.render_report()``. + """ + import openerp + registry = openerp.modules.registry.RegistryManager.get(cr.dbname) + return registry['ir.actions.report.xml'].render_report(cr, uid, ids, name, data, context) + + # vim:expandtab:smartindent:tabstop=4:softtabstop=4:shiftwidth=4: diff --git a/openerp/service/report.py b/openerp/service/report.py index d7832dfb40b..5144a064b1e 100644 --- a/openerp/service/report.py +++ b/openerp/service/report.py @@ -7,6 +7,7 @@ import threading import openerp.netsvc import openerp.pooler +import openerp.report from openerp import tools import security @@ -51,8 +52,7 @@ def exp_render_report(db, uid, object, ids, datas=None, context=None): cr = openerp.pooler.get_db(db).cursor() try: - obj = openerp.netsvc.LocalService('report.'+object) - (result, format) = obj.create(cr, uid, ids, datas, context) + result, format = openerp.report.render_report(cr, uid, ids, object, datas, context) if not result: tb = sys.exc_info() self_reports[id]['exception'] = openerp.exceptions.DeferredException('RML is not available at specified location or not enough data to print!', tb) @@ -90,8 +90,7 @@ def exp_report(db, uid, object, ids, datas=None, context=None): def go(id, uid, ids, datas, context): cr = openerp.pooler.get_db(db).cursor() try: - obj = openerp.netsvc.LocalService('report.'+object, cursor=cr) - (result, format) = obj.create(cr, uid, ids, datas, context) + result, format = openerp.report.render_report(cr, uid, ids, object, datas, context) if not result: tb = sys.exc_info() self_reports[id]['exception'] = openerp.exceptions.DeferredException('RML is not available at specified location or not enough data to print!', tb) diff --git a/openerp/tools/test_reports.py b/openerp/tools/test_reports.py index 71cedc1a98d..ccb9c839dc9 100644 --- a/openerp/tools/test_reports.py +++ b/openerp/tools/test_reports.py @@ -26,6 +26,7 @@ """ import openerp.netsvc as netsvc +import openerp.report import openerp.tools as tools import logging import openerp.pooler as pooler @@ -50,7 +51,7 @@ def try_report(cr, uid, rname, ids, data=None, context=None, our_module=None): else: rname_s = rname _logger.log(netsvc.logging.TEST, " - Trying %s.create(%r)", rname, ids) - res = netsvc.LocalService(rname, cursor=cr).create(cr, uid, ids, data, context) + res = openerp.report.render_report(cr, uid, ids, rname_s, data, context) if not isinstance(res, tuple): raise RuntimeError("Result of %s.create() should be a (data,format) tuple, now it is a %s" % \ (rname, type(res))) From 575771f6519aba14b8073a79408731d3faadbecb Mon Sep 17 00:00:00 2001 From: Vo Minh Thu Date: Fri, 22 Feb 2013 14:36:37 +0100 Subject: [PATCH 03/34] [FIX] ir_actions: wrong namespace. bzr revid: vmt@openerp.com-20130222133637-14d903ci0hvwej5j --- openerp/addons/base/ir/ir_actions.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/openerp/addons/base/ir/ir_actions.py b/openerp/addons/base/ir/ir_actions.py index 71170f42e91..8929c13489c 100644 --- a/openerp/addons/base/ir/ir_actions.py +++ b/openerp/addons/base/ir/ir_actions.py @@ -138,7 +138,7 @@ class report_xml(osv.osv): # raise Exception, "Unhandled report type: %s" % r pass if new_report is None: - new_report = interface.report_int._reports['report.' + name] + new_report = openerp.report.interface.report_int._reports['report.' + name] return new_report.create(cr, uid, ids, data, context) From 1ce0db171dbb3c383d300dc705a607e1705fdc96 Mon Sep 17 00:00:00 2001 From: Vo Minh Thu Date: Fri, 22 Feb 2013 14:40:12 +0100 Subject: [PATCH 04/34] [DOC] changelog: give a better hint at how LocalService() can be replaced. bzr revid: vmt@openerp.com-20130222134012-n8zg5s3jud08me18 --- doc/changelog.rst | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/doc/changelog.rst b/doc/changelog.rst index ec75fadfe6b..bb18944b514 100644 --- a/doc/changelog.rst +++ b/doc/changelog.rst @@ -7,7 +7,8 @@ Changelog ------- - Almost removed ``LocalService()``. For reports, - ``openerp.report.render_report()`` can be used. + ``openerp.report.render_report()`` can be used. For workflows, see + :ref:`orm-workflows`. - Added the :ref:`Long polling ` worker type. - Added :ref:`orm-workflows` to the ORM. - Added :ref:`routing-decorators` to the RPC and WSGI stack. From 460cc6f755899ef45c09c17dc6e66cfea04e4eaf Mon Sep 17 00:00:00 2001 From: Vo Minh Thu Date: Fri, 22 Feb 2013 15:24:00 +0100 Subject: [PATCH 05/34] [IMP] ir.actions.report.xml: allow for a smoother transition for reports still declared the old way (in Python). bzr revid: vmt@openerp.com-20130222142400-qoomw17s2u8a73kh --- openerp/addons/base/ir/ir_actions.py | 42 +++++++++++++++------------- 1 file changed, 22 insertions(+), 20 deletions(-) diff --git a/openerp/addons/base/ir/ir_actions.py b/openerp/addons/base/ir/ir_actions.py index 8929c13489c..5bb70ed4cf1 100644 --- a/openerp/addons/base/ir/ir_actions.py +++ b/openerp/addons/base/ir/ir_actions.py @@ -118,27 +118,29 @@ class report_xml(osv.osv): import os opj = os.path.join - cr.execute("SELECT * FROM ir_act_report_xml WHERE report_name=%s", (name,)) - new_report = None - for r in cr.dictfetchall(): - if r['report_rml'] or r['report_rml_content_data']: - if r['parser']: - kwargs = { 'parser': operator.attrgetter(r['parser'])(openerp.addons) } - else: - kwargs = {} - new_report = report_sxw('report.'+r['report_name'], r['model'], - opj('addons',r['report_rml'] or '/'), header=r['header'], register=False, **kwargs) - elif r['report_xsl']: - new_report = report_rml('report.'+r['report_name'], r['model'], - opj('addons',r['report_xml']), - r['report_xsl'] and opj('addons',r['report_xsl']), register=False) - else: - # TODO: - # Temporarily, we look reports up the _reports dict. - # raise Exception, "Unhandled report type: %s" % r - pass - if new_report is None: + # First lookup in the deprecated place, because if the report definition + # has not been updated, it is more likely the correct definition is there. + if 'report.' + name in openerp.report.interface.report_int._reports: new_report = openerp.report.interface.report_int._reports['report.' + name] + else: + cr.execute("SELECT * FROM ir_act_report_xml WHERE report_name=%s", (name,)) + r = cr.dictfetchone() + if r: + if r['report_rml'] or r['report_rml_content_data']: + if r['parser']: + kwargs = { 'parser': operator.attrgetter(r['parser'])(openerp.addons) } + else: + kwargs = {} + new_report = report_sxw('report.'+r['report_name'], r['model'], + opj('addons',r['report_rml'] or '/'), header=r['header'], register=False, **kwargs) + elif r['report_xsl']: + new_report = report_rml('report.'+r['report_name'], r['model'], + opj('addons',r['report_xml']), + r['report_xsl'] and opj('addons',r['report_xsl']), register=False) + else: + raise Exception, "Unhandled report type: %s" % r + else: + raise Exception, "Required report does not exist: %s" % r return new_report.create(cr, uid, ids, data, context) From efb97705f571e74e61084fe6c3afc5c8d6697db1 Mon Sep 17 00:00:00 2001 From: Vo Minh Thu Date: Fri, 22 Feb 2013 15:52:26 +0100 Subject: [PATCH 06/34] [IMP] LocalService(): re-allow for a few moment (so addons can be updated a bit later). bzr revid: vmt@openerp.com-20130222145226-dqu6e612oi3yalow --- openerp/netsvc.py | 12 ++++++++---- 1 file changed, 8 insertions(+), 4 deletions(-) diff --git a/openerp/netsvc.py b/openerp/netsvc.py index aab166ab4c2..3620cbd0525 100644 --- a/openerp/netsvc.py +++ b/openerp/netsvc.py @@ -46,10 +46,14 @@ import openerp _logger = logging.getLogger(__name__) -# TODO LocalService is deprecated. -def LocalService(name, cursor=None): - assert name == 'workflow' - return openerp.workflow +def LocalService(name): + _logger.warning("LocalService() is deprecated.") + + if name == 'workflow': + return openerp.workflow + + if name.startswith('report.'): + return openerp.report.interface.report_int._reports[name] BLACK, RED, GREEN, YELLOW, BLUE, MAGENTA, CYAN, WHITE, _NOTHING, DEFAULT = range(10) #The background is set with 40 plus the number of the color, and the foreground with 30 From ef127fddc7676e616cd6a256c448382fc7861cb3 Mon Sep 17 00:00:00 2001 From: Vo Minh Thu Date: Fri, 22 Feb 2013 15:52:50 +0100 Subject: [PATCH 07/34] [IMP] netsvc: removed unused import. bzr revid: vmt@openerp.com-20130222145250-qd9v52tu2xt8jyb2 --- openerp/modules/graph.py | 2 -- openerp/modules/migration.py | 2 -- openerp/osv/orm.py | 1 - openerp/service/report.py | 1 - openerp/tools/test_reports.py | 7 +++---- 5 files changed, 3 insertions(+), 10 deletions(-) diff --git a/openerp/modules/graph.py b/openerp/modules/graph.py index 56b17e3239a..0e14480d8ac 100644 --- a/openerp/modules/graph.py +++ b/openerp/modules/graph.py @@ -36,8 +36,6 @@ from openerp.tools.safe_eval import safe_eval as eval import openerp.pooler as pooler from openerp.tools.translate import _ -import openerp.netsvc as netsvc - import zipfile import openerp.release as release diff --git a/openerp/modules/migration.py b/openerp/modules/migration.py index e0faa77c3a4..16de56879b9 100644 --- a/openerp/modules/migration.py +++ b/openerp/modules/migration.py @@ -36,8 +36,6 @@ from openerp.tools.safe_eval import safe_eval as eval import openerp.pooler as pooler from openerp.tools.translate import _ -import openerp.netsvc as netsvc - import zipfile import openerp.release as release diff --git a/openerp/osv/orm.py b/openerp/osv/orm.py index e4a5a5435fd..d23663fb700 100644 --- a/openerp/osv/orm.py +++ b/openerp/osv/orm.py @@ -59,7 +59,6 @@ from lxml import etree import fields import openerp -import openerp.netsvc as netsvc import openerp.tools as tools from openerp.tools.config import config from openerp.tools.misc import CountingStream diff --git a/openerp/service/report.py b/openerp/service/report.py index 5144a064b1e..73d8d6a7e3d 100644 --- a/openerp/service/report.py +++ b/openerp/service/report.py @@ -5,7 +5,6 @@ import logging import sys import threading -import openerp.netsvc import openerp.pooler import openerp.report from openerp import tools diff --git a/openerp/tools/test_reports.py b/openerp/tools/test_reports.py index ccb9c839dc9..3fd1ba2fed4 100644 --- a/openerp/tools/test_reports.py +++ b/openerp/tools/test_reports.py @@ -25,7 +25,6 @@ through the code of yaml tests. """ -import openerp.netsvc as netsvc import openerp.report import openerp.tools as tools import logging @@ -50,7 +49,7 @@ def try_report(cr, uid, rname, ids, data=None, context=None, our_module=None): rname_s = rname[7:] else: rname_s = rname - _logger.log(netsvc.logging.TEST, " - Trying %s.create(%r)", rname, ids) + _logger.log(logging.TEST, " - Trying %s.create(%r)", rname, ids) res = openerp.report.render_report(cr, uid, ids, rname_s, data, context) if not isinstance(res, tuple): raise RuntimeError("Result of %s.create() should be a (data,format) tuple, now it is a %s" % \ @@ -93,7 +92,7 @@ def try_report(cr, uid, rname, ids, data=None, context=None, our_module=None): _logger.warning("Report %s produced a \"%s\" chunk, cannot examine it", rname, res_format) return False - _logger.log(netsvc.logging.TEST, " + Report %s produced correctly.", rname) + _logger.log(logging.TEST, " + Report %s produced correctly.", rname) return True def try_report_action(cr, uid, action_id, active_model=None, active_ids=None, @@ -127,7 +126,7 @@ def try_report_action(cr, uid, action_id, active_model=None, active_ids=None, pool = pooler.get_pool(cr.dbname) def log_test(msg, *args): - _logger.log(netsvc.logging.TEST, " - " + msg, *args) + _logger.log(logging.TEST, " - " + msg, *args) datas = {} if active_model: From 48d1bce6ec4fd77a98923b7132e718b33cafadd8 Mon Sep 17 00:00:00 2001 From: Vo Minh Thu Date: Fri, 22 Feb 2013 16:13:11 +0100 Subject: [PATCH 08/34] [IMP] report: remove the print statement upon report registration. bzr revid: vmt@openerp.com-20130222151311-xz609m3o5jazo7ld --- openerp/report/interface.py | 6 ++---- 1 file changed, 2 insertions(+), 4 deletions(-) diff --git a/openerp/report/interface.py b/openerp/report/interface.py index 6c5fc24b559..d6d90b17d42 100644 --- a/openerp/report/interface.py +++ b/openerp/report/interface.py @@ -45,10 +45,8 @@ class report_int(object): def __init__(self, name, register=True): if register: - print "*** Registering report `%s` but it should be registered trough data declaration instead. ***" % name - if not name.startswith('report.'): - raise Exception('ConceptionError, bad report name, should start with "report."') - assert name not in self._reports, 'The report "%s" already exists!' % name + assert name.startswith('report.'), 'Report names should start with "report.".' + assert name not in self._reports, 'The report "%s" already exists.' % name self._reports[name] = self else: # The report is instanciated at each use site, which is ok. From a2f5e9d201f94938d432174d869b1a662f6b1093 Mon Sep 17 00:00:00 2001 From: Vo Minh Thu Date: Fri, 22 Feb 2013 16:17:02 +0100 Subject: [PATCH 09/34] [IMP] ir_actions: removed forgotten print statements. bzr revid: vmt@openerp.com-20130222151702-d73geh539mb99m5b --- openerp/addons/base/ir/ir_actions.py | 3 --- openerp/netsvc.py | 3 --- 2 files changed, 6 deletions(-) diff --git a/openerp/addons/base/ir/ir_actions.py b/openerp/addons/base/ir/ir_actions.py index 5bb70ed4cf1..bfef042ef57 100644 --- a/openerp/addons/base/ir/ir_actions.py +++ b/openerp/addons/base/ir/ir_actions.py @@ -96,11 +96,8 @@ class report_xml(osv.osv): result = cr.dictfetchall() reports = openerp.report.interface.report_int._reports for r in result: - print ">>> Registering:", r['report_name'], "...", if reports.has_key('report.'+r['report_name']): - print " Already present." continue - print " Done." if r['report_rml'] or r['report_rml_content_data']: report_sxw('report.'+r['report_name'], r['model'], opj('addons',r['report_rml'] or '/'), header=r['header']) diff --git a/openerp/netsvc.py b/openerp/netsvc.py index 3620cbd0525..94e1664c852 100644 --- a/openerp/netsvc.py +++ b/openerp/netsvc.py @@ -21,12 +21,9 @@ ############################################################################## -import errno import logging import logging.handlers -import operator import os -import platform import release import sys import threading From 687fc9afac3cab2d765f3bae65772430588d9abd Mon Sep 17 00:00:00 2001 From: Vo Minh Thu Date: Fri, 22 Feb 2013 16:36:49 +0100 Subject: [PATCH 10/34] [DOC] report. bzr revid: vmt@openerp.com-20130222153649-h4quh4r8ptz465s1 --- doc/03_module_dev.rst | 1 + doc/report-declaration.rst | 23 +++++++++++++++++++++++ 2 files changed, 24 insertions(+) create mode 100644 doc/report-declaration.rst diff --git a/doc/03_module_dev.rst b/doc/03_module_dev.rst index 72f035be4d0..c5f965e4b93 100644 --- a/doc/03_module_dev.rst +++ b/doc/03_module_dev.rst @@ -13,3 +13,4 @@ Modules 03_module_dev_04 03_module_dev_05 03_module_dev_06 + report-declaration diff --git a/doc/report-declaration.rst b/doc/report-declaration.rst new file mode 100644 index 00000000000..2a40c96ec61 --- /dev/null +++ b/doc/report-declaration.rst @@ -0,0 +1,23 @@ +.. _report-declaration: + +Report declaration +================== + +.. versionadded:: 7.1 + +Before version 7.1, report declaration could be done in two different ways: +either via a ```` tag in XML, or via such a tag and a class +instanciation in a Python module. Instanciating a class in a Python module was +necessary when a custom parser was used. + +In version 7.1, the recommended way to register a report is to use only the +```` XML tag. The tag can now support an additional ``parser`` +attribute. The value for that attibute must be a fully-qualified class name, +without the leading ``openerp.addons.`` namespace. + +.. note:: + The rational to deprecate the manual class instanciation is to make all + reports visible in the database, have a unique way to declare reports + instead of two, and remove the need to maintain a registry of reports in + memory. + From 5c9b5e4ac352a59674ff7686d0c9cbc7163907ba Mon Sep 17 00:00:00 2001 From: Vo Minh Thu Date: Mon, 25 Feb 2013 14:35:32 +0100 Subject: [PATCH 11/34] [IMP] netsvc: slightly more explicit warning when using LocalService(). bzr revid: vmt@openerp.com-20130225133532-o3m2e6vvzcmdeziv --- openerp/netsvc.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/openerp/netsvc.py b/openerp/netsvc.py index 94e1664c852..3b5ee2c835c 100644 --- a/openerp/netsvc.py +++ b/openerp/netsvc.py @@ -44,7 +44,7 @@ import openerp _logger = logging.getLogger(__name__) def LocalService(name): - _logger.warning("LocalService() is deprecated.") + _logger.warning("LocalService('%s') is deprecated." % name) if name == 'workflow': return openerp.workflow From b08d7ef6bd0f1b8a36d82e238d563a37c7fa9057 Mon Sep 17 00:00:00 2001 From: Vo Minh Thu Date: Fri, 22 Mar 2013 16:39:55 +0100 Subject: [PATCH 12/34] [REF] ir.actions.report.xml: register_all do not make sense any more: auto=True reports are looked up in the database for each rendering, so they do no have to be in the report registry any longer. auto=False reports will register themselves but at this point they can be updated to use the new `parser` XML attribute. bzr revid: vmt@openerp.com-20130322153955-s6nyux2pyez6c01w --- openerp/addons/base/ir/ir_actions.py | 22 +--------------------- openerp/modules/registry.py | 1 - 2 files changed, 1 insertion(+), 22 deletions(-) diff --git a/openerp/addons/base/ir/ir_actions.py b/openerp/addons/base/ir/ir_actions.py index 9a76d5c28fc..b32617d0134 100644 --- a/openerp/addons/base/ir/ir_actions.py +++ b/openerp/addons/base/ir/ir_actions.py @@ -85,27 +85,6 @@ class report_xml(osv.osv): res[report.id] = False return res - def register_all(self, cr): - """Report registration handler that may be overridden by subclasses to - add their own kinds of report services. - Loads all reports with no manual loaders (auto==True) and - registers the appropriate services to implement them. - """ - opj = os.path.join - cr.execute("SELECT * FROM ir_act_report_xml WHERE auto=%s ORDER BY id", (True,)) - result = cr.dictfetchall() - reports = openerp.report.interface.report_int._reports - for r in result: - if reports.has_key('report.'+r['report_name']): - continue - if r['report_rml'] or r['report_rml_content_data']: - report_sxw('report.'+r['report_name'], r['model'], - opj('addons',r['report_rml'] or '/'), header=r['header']) - if r['report_xsl']: - report_rml('report.'+r['report_name'], r['model'], - opj('addons',r['report_xml']), - r['report_xsl'] and opj('addons',r['report_xsl'])) - def render_report(self, cr, uid, ids, name, data, context=None): """ Look up a report definition and render the report for the provided IDs. @@ -117,6 +96,7 @@ class report_xml(osv.osv): # First lookup in the deprecated place, because if the report definition # has not been updated, it is more likely the correct definition is there. + # Only reports with custom parser sepcified in Python are still there. if 'report.' + name in openerp.report.interface.report_int._reports: new_report = openerp.report.interface.report_int._reports['report.' + name] else: diff --git a/openerp/modules/registry.py b/openerp/modules/registry.py index b06c500a24c..89cb6143a59 100644 --- a/openerp/modules/registry.py +++ b/openerp/modules/registry.py @@ -225,7 +225,6 @@ class RegistryManager(object): try: Registry.setup_multi_process_signaling(cr) registry.do_parent_store(cr) - registry.get('ir.actions.report.xml').register_all(cr) cr.commit() finally: cr.close() From 010d8044fe40d3ed402dff0cf8b1c7306a92b00a Mon Sep 17 00:00:00 2001 From: Vo Minh Thu Date: Fri, 22 Mar 2013 17:22:51 +0100 Subject: [PATCH 13/34] [REF] ir.actions.report.xml: renamed ids to res_ids because those are not the self model IDs. bzr revid: vmt@openerp.com-20130322162251-j0f3eobpc6oh4il1 --- openerp/addons/base/ir/ir_actions.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/openerp/addons/base/ir/ir_actions.py b/openerp/addons/base/ir/ir_actions.py index b32617d0134..4b4ed6fe799 100644 --- a/openerp/addons/base/ir/ir_actions.py +++ b/openerp/addons/base/ir/ir_actions.py @@ -85,7 +85,7 @@ class report_xml(osv.osv): res[report.id] = False return res - def render_report(self, cr, uid, ids, name, data, context=None): + def render_report(self, cr, uid, res_ids, name, data, context=None): """ Look up a report definition and render the report for the provided IDs. """ @@ -119,7 +119,7 @@ class report_xml(osv.osv): else: raise Exception, "Required report does not exist: %s" % r - return new_report.create(cr, uid, ids, data, context) + return new_report.create(cr, uid, res_ids, data, context) _name = 'ir.actions.report.xml' _inherit = 'ir.actions.actions' From 6e43e6c4e1cc8da4b2cd1f6919ea43c79295686c Mon Sep 17 00:00:00 2001 From: Vo Minh Thu Date: Mon, 25 Mar 2013 13:33:59 +0100 Subject: [PATCH 14/34] [FIX] reports: now that _register_all() has been removed, LocalService() must be modified to do the lookup in the database too. bzr revid: vmt@openerp.com-20130325123359-szxx6a0n06tha70p --- openerp/addons/base/ir/ir_actions.py | 11 +++++++++-- openerp/netsvc.py | 18 +++++++++++++++++- 2 files changed, 26 insertions(+), 3 deletions(-) diff --git a/openerp/addons/base/ir/ir_actions.py b/openerp/addons/base/ir/ir_actions.py index 4b4ed6fe799..1d717048b3f 100644 --- a/openerp/addons/base/ir/ir_actions.py +++ b/openerp/addons/base/ir/ir_actions.py @@ -85,9 +85,9 @@ class report_xml(osv.osv): res[report.id] = False return res - def render_report(self, cr, uid, res_ids, name, data, context=None): + def _lookup_report(self, cr, name): """ - Look up a report definition and render the report for the provided IDs. + Look up a report definition. """ import openerp import operator @@ -119,6 +119,13 @@ class report_xml(osv.osv): else: raise Exception, "Required report does not exist: %s" % r + return new_report + + def render_report(self, cr, uid, res_ids, name, data, context=None): + """ + Look up a report definition and render the report for the provided IDs. + """ + new_report = self._lookup_report(cr, name) return new_report.create(cr, uid, res_ids, data, context) _name = 'ir.actions.report.xml' diff --git a/openerp/netsvc.py b/openerp/netsvc.py index 1e1cd887d1a..4ad2d24ddb2 100644 --- a/openerp/netsvc.py +++ b/openerp/netsvc.py @@ -44,13 +44,29 @@ import openerp _logger = logging.getLogger(__name__) def LocalService(name): + """ + The openerp.netsvc.LocalService() fucntion is deprecated. It still works + in two cases: workflows and reports. For workflows, instead of using + LocalService('workflow'), openerp.workflow should be used (better yet, + methods on openerp.osv.orm.Model should be used). For reports, + openerp.report.render_report() should be used (methods on the Model should + be provided too in the future). + """ _logger.warning("LocalService('%s') is deprecated." % name) if name == 'workflow': return openerp.workflow if name.startswith('report.'): - return openerp.report.interface.report_int._reports[name] + report = openerp.report.interface.report_int._reports.get(name) + if report: + return report + else: + dbname = getattr(threading.currentThread(), 'dbname', None) + if dbname: + registry = openerp.modules.registry.RegistryManager.get(dbname) + with registry.cursor() as cr: + return registry['ir.actions.report.xml']._lookup_report(cr, name[len('report.'):]) BLACK, RED, GREEN, YELLOW, BLUE, MAGENTA, CYAN, WHITE, _NOTHING, DEFAULT = range(10) #The background is set with 40 plus the number of the color, and the foreground with 30 From 464af881bf9915514f21cbc03f0537ab7355a0e6 Mon Sep 17 00:00:00 2001 From: Vo Minh Thu Date: Mon, 25 Mar 2013 14:12:45 +0100 Subject: [PATCH 15/34] [IMP] netsvc: LocalService deprecation now guarded via openerp.conf.deprecation. bzr revid: vmt@openerp.com-20130325131245-9o5uizn6v4r8irc3 --- openerp/conf/deprecation.py | 12 ++++++++++++ openerp/netsvc.py | 3 ++- openerp/report/report_sxw.py | 11 +++++++++++ 3 files changed, 25 insertions(+), 1 deletion(-) diff --git a/openerp/conf/deprecation.py b/openerp/conf/deprecation.py index 11399bef4fb..fec2fbbf224 100644 --- a/openerp/conf/deprecation.py +++ b/openerp/conf/deprecation.py @@ -26,6 +26,8 @@ additional code is needed throughout the core library. This module keeps track of those specific measures by providing variables that can be unset by the user to check if her code is future proof. +In a perfect world, all these variables are set to False, the corresponding +code removed, and thus these variables made unnecessary. """ # If True, the Python modules inside the openerp namespace are made available @@ -35,4 +37,14 @@ by the user to check if her code is future proof. # Change to False around 2013.02. open_openerp_namespace = False +# If True, openerp.netsvc.LocalService() can be used to lookup reports or to +# access openerp.workflow. +# Introduced around 2013.03. +# Among the related code: +# - The openerp.netsvc.LocalService() function. +# - The openerp.report.interface.report_int._reports dictionary. +# - The register attribute in openerp.report.report_sxw (and in its inheriting +# classes). +allow_local_service = True + # vim:expandtab:smartindent:tabstop=4:softtabstop=4:shiftwidth=4: diff --git a/openerp/netsvc.py b/openerp/netsvc.py index 4ad2d24ddb2..799fd74158b 100644 --- a/openerp/netsvc.py +++ b/openerp/netsvc.py @@ -52,7 +52,8 @@ def LocalService(name): openerp.report.render_report() should be used (methods on the Model should be provided too in the future). """ - _logger.warning("LocalService('%s') is deprecated." % name) + assert openerp.conf.deprecation.allow_local_service + _logger.warning("LocalService() is deprecated since march 2013 (it was called with '%s')." % name) if name == 'workflow': return openerp.workflow diff --git a/openerp/report/report_sxw.py b/openerp/report/report_sxw.py index 0e2a7e18edd..b0fb70513bb 100644 --- a/openerp/report/report_sxw.py +++ b/openerp/report/report_sxw.py @@ -388,6 +388,17 @@ class rml_parse(object): self.setCompany(objects[0].company_id) class report_sxw(report_rml, preprocess.report): + """ + The register=True kwarg has been added to help remove the + openerp.netsvc.LocalService() indirection and the related + openerp.report.interface.report_int._reports dictionary: + report_sxw registered in XML with auto=False are also registered in Python. + In that case, they are registered in the above dictionary. Since + registration is automatically done upon instanciation, and that + instanciation is needed before rendering, a way was needed to + instanciate-without-register a report. In the future, no report + should be registered in the above dictionary and it will be dropped. + """ def __init__(self, name, table, rml=False, parser=rml_parse, header='external', store=False, register=True): report_rml.__init__(self, name, table, rml, '', register=register) self.name = name From 1ea66164f30437a176e72cdc453c307e7c66b3f5 Mon Sep 17 00:00:00 2001 From: Vo Minh Thu Date: Mon, 25 Mar 2013 14:17:56 +0100 Subject: [PATCH 16/34] [IMP] report: registration deprecation now guarded via openerp.conf.deprecation. bzr revid: vmt@openerp.com-20130325131756-5bns19n20nar9ogs --- openerp/conf/deprecation.py | 9 +++++++-- openerp/report/interface.py | 2 ++ 2 files changed, 9 insertions(+), 2 deletions(-) diff --git a/openerp/conf/deprecation.py b/openerp/conf/deprecation.py index fec2fbbf224..66ddfc441d4 100644 --- a/openerp/conf/deprecation.py +++ b/openerp/conf/deprecation.py @@ -43,8 +43,13 @@ open_openerp_namespace = False # Among the related code: # - The openerp.netsvc.LocalService() function. # - The openerp.report.interface.report_int._reports dictionary. -# - The register attribute in openerp.report.report_sxw (and in its inheriting -# classes). +# - The register attribute in openerp.report.interface.report_int (and in its +# inheriting classes). allow_local_service = True +# Applies for the register attribute in openerp.report.interface.report_int. +# See comments for allow_local_service above. +# Introduced around 2013.03. +allow_report_int_registration = True + # vim:expandtab:smartindent:tabstop=4:softtabstop=4:shiftwidth=4: diff --git a/openerp/report/interface.py b/openerp/report/interface.py index d6d90b17d42..2f3a89a913b 100644 --- a/openerp/report/interface.py +++ b/openerp/report/interface.py @@ -45,6 +45,8 @@ class report_int(object): def __init__(self, name, register=True): if register: + import openerp + assert openerp.conf.deprecation.allow_report_int_registration assert name.startswith('report.'), 'Report names should start with "report.".' assert name not in self._reports, 'The report "%s" already exists.' % name self._reports[name] = self From cea4c4ff8c10985cb8ba3aa2c915d305a97cb0dc Mon Sep 17 00:00:00 2001 From: Vo Minh Thu Date: Mon, 25 Mar 2013 14:48:36 +0100 Subject: [PATCH 17/34] [IMP] conf.deprecation: comment. bzr revid: vmt@openerp.com-20130325134836-0mlduchmvw8ken2o --- openerp/conf/deprecation.py | 1 + 1 file changed, 1 insertion(+) diff --git a/openerp/conf/deprecation.py b/openerp/conf/deprecation.py index 66ddfc441d4..41bd4f971d9 100644 --- a/openerp/conf/deprecation.py +++ b/openerp/conf/deprecation.py @@ -44,6 +44,7 @@ open_openerp_namespace = False # - The openerp.netsvc.LocalService() function. # - The openerp.report.interface.report_int._reports dictionary. # - The register attribute in openerp.report.interface.report_int (and in its +# - auto column in ir.actions.report.xml. # inheriting classes). allow_local_service = True From 2829882389f08ae3ea0e449ca1b5d835bbdc6144 Mon Sep 17 00:00:00 2001 From: Vo Minh Thu Date: Mon, 25 Mar 2013 15:32:56 +0100 Subject: [PATCH 18/34] [IMP] orm: added a print_report() method. bzr revid: vmt@openerp.com-20130325143256-f8hw66j09310cgjo --- openerp/osv/orm.py | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/openerp/osv/orm.py b/openerp/osv/orm.py index c6609592e00..69c7498c6b9 100644 --- a/openerp/osv/orm.py +++ b/openerp/osv/orm.py @@ -5155,6 +5155,15 @@ class BaseModel(object): get_xml_id = get_external_id _get_xml_ids = _get_external_ids + def print_report(self, cr, uid, ids, name, data, context=None): + """ + Render the report `name` for the given IDs. The report must be defined + for this model, not another. + """ + report = self.pool['ir.actions.report.xml']._lookup_report(cr, name) + assert self._name == report.table + return report.create(cr, uid, ids, data, context) + # Transience def is_transient(self): """ Return whether the model is transient. From 63222e389e75834e3986fd30ec9bb69f6ff9703d Mon Sep 17 00:00:00 2001 From: Vo Minh Thu Date: Mon, 25 Mar 2013 15:40:55 +0100 Subject: [PATCH 19/34] [DOC] changelog updated to mention the new print_report(). bzr revid: vmt@openerp.com-20130325144055-kmoixbn2e40vr3vu --- doc/changelog.rst | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/doc/changelog.rst b/doc/changelog.rst index 0080a66c176..59c4a6bced5 100644 --- a/doc/changelog.rst +++ b/doc/changelog.rst @@ -7,7 +7,7 @@ Changelog ------- - Almost removed ``LocalService()``. For reports, - ``openerp.report.render_report()`` can be used. For workflows, see + ``openerp.osv.orm.Model.print_report()`` can be used. For workflows, see :ref:`orm-workflows`. - Removed support for the ``NET-RPC`` protocol. - Added the :ref:`Long polling ` worker type. From 385491f46e990936b039c8749b18b8f8a9bcbc86 Mon Sep 17 00:00:00 2001 From: Vo Minh Thu Date: Mon, 25 Mar 2013 15:48:33 +0100 Subject: [PATCH 20/34] [IMP] yaml_import: add openerp in the evaluation context. bzr revid: vmt@openerp.com-20130325144833-aos5t6x5bc8vi0ss --- openerp/tools/yaml_import.py | 10 +++++++++- 1 file changed, 9 insertions(+), 1 deletion(-) diff --git a/openerp/tools/yaml_import.py b/openerp/tools/yaml_import.py index 3172caac1f4..2ce7fc0a99a 100644 --- a/openerp/tools/yaml_import.py +++ b/openerp/tools/yaml_import.py @@ -540,10 +540,18 @@ class YamlInterpreter(object): self.noupdate = node.noupdate def process_python(self, node): + import openerp python, statements = node.items()[0] model = self.get_model(python.model) statements = statements.replace("\r\n", "\n") - code_context = { 'model': model, 'cr': self.cr, 'uid': self.uid, 'log': self._log, 'context': self.context } + code_context = { + 'model': model, + 'cr': self.cr, + 'uid': self.uid, + 'log': self._log, + 'context': self.context, + 'openerp': openerp, + } code_context.update({'self': model}) # remove me when no !python block test uses 'self' anymore try: code_obj = compile(statements, self.filename, 'exec') From d96ec9c680ea3ea5c9d961192a51478593447a3b Mon Sep 17 00:00:00 2001 From: Vo Minh Thu Date: Tue, 26 Mar 2013 16:40:06 +0100 Subject: [PATCH 21/34] [REF] logging: removed deprecated Logger class. bzr revid: vmt@openerp.com-20130326154006-s19z7aem22qeboo0 --- openerp/loglevels.py | 61 -------------------------------------------- 1 file changed, 61 deletions(-) diff --git a/openerp/loglevels.py b/openerp/loglevels.py index 3172a2b2042..b58b4d0bfa9 100644 --- a/openerp/loglevels.py +++ b/openerp/loglevels.py @@ -33,67 +33,6 @@ LOG_CRITICAL = 'critical' logging.TEST = logging.INFO - 5 logging.addLevelName(logging.TEST, 'TEST') -_logger = logging.getLogger(__name__) - -class Logger(object): - def __init__(self): - _logger.warning( - "The netsvc.Logger API shouldn't be used anymore, please " - "use the standard `logging.getLogger` API instead.") - super(Logger, self).__init__() - - def notifyChannel(self, name, level, msg): - _logger.warning( - "notifyChannel API shouldn't be used anymore, please use " - "the standard `logging` module instead.") - from service import common - - log = logging.getLogger(__name__ + '.deprecated.' + ustr(name)) - - if level in [LOG_TEST] and not hasattr(log, level): - fct = lambda msg, *args, **kwargs: log.log(getattr(logging, level.upper()), msg, *args, **kwargs) - setattr(log, level, fct) - - - level_method = getattr(log, level) - - if isinstance(msg, Exception): - msg = exception_to_unicode(msg) - - try: - msg = ustr(msg).strip() - if level in (LOG_ERROR, LOG_CRITICAL): # and tools.config.get_misc('debug','env_info',False): - msg = common.exp_get_server_environment() + "\n" + msg - - result = msg.split('\n') - except UnicodeDecodeError: - result = msg.strip().split('\n') - try: - if len(result)>1: - for idx, s in enumerate(result): - level_method('[%02d]: %s' % (idx+1, s,)) - elif result: - level_method(result[0]) - except IOError: - # TODO: perhaps reset the logger streams? - #if logrotate closes our files, we end up here.. - pass - except Exception: - # better ignore the exception and carry on.. - pass - - def set_loglevel(self, level, logger=None): - if logger is not None: - log = logging.getLogger(str(logger)) - else: - log = logging.getLogger() - log.setLevel(logging.INFO) # make sure next msg is printed - log.info("Log level changed to %s" % logging.getLevelName(level)) - log.setLevel(level) - - def shutdown(self): - logging.shutdown() - # TODO get_encodings, ustr and exception_to_unicode were originally from tools.misc. # There are here until we refactor tools so that this module doesn't depends on tools. From c313b4073ae6721b057f1ea2c87b2cc5139776a8 Mon Sep 17 00:00:00 2001 From: Vo Minh Thu Date: Tue, 26 Mar 2013 16:58:44 +0100 Subject: [PATCH 22/34] [REF] logging: removed pseudo log-level TEST. When --test-enable is used, it is expected that test output is visible, thus using log-level INFO is natural. On the down side you lose the nice blue hint that tests did actually run when --log-level test was given. bzr revid: vmt@openerp.com-20130326155844-83e2tcqokvblr0ln --- openerp/addons/base/ir/ir_mail_server.py | 2 +- openerp/loglevels.py | 5 ----- openerp/modules/loading.py | 2 +- openerp/modules/module.py | 4 ++-- openerp/netsvc.py | 2 -- openerp/tools/config.py | 2 +- openerp/tools/test_reports.py | 6 +++--- openerp/tools/yaml_import.py | 2 +- openerpcommand/initialize.py | 2 +- 9 files changed, 10 insertions(+), 17 deletions(-) diff --git a/openerp/addons/base/ir/ir_mail_server.py b/openerp/addons/base/ir/ir_mail_server.py index 5a3c40552f0..24feefb18ad 100644 --- a/openerp/addons/base/ir/ir_mail_server.py +++ b/openerp/addons/base/ir/ir_mail_server.py @@ -411,7 +411,7 @@ class ir_mail_server(osv.osv): # Do not actually send emails in testing mode! if getattr(threading.currentThread(), 'testing', False): - _logger.log(logging.TEST, "skip sending email in test mode") + _logger.info("skip sending email in test mode") return message['Message-Id'] # Get SMTP Server Details from Mail Server diff --git a/openerp/loglevels.py b/openerp/loglevels.py index b58b4d0bfa9..fdb32d8d2f0 100644 --- a/openerp/loglevels.py +++ b/openerp/loglevels.py @@ -20,19 +20,14 @@ ############################################################################## import sys -import logging LOG_NOTSET = 'notset' LOG_DEBUG = 'debug' -LOG_TEST = 'test' LOG_INFO = 'info' LOG_WARNING = 'warn' LOG_ERROR = 'error' LOG_CRITICAL = 'critical' -logging.TEST = logging.INFO - 5 -logging.addLevelName(logging.TEST, 'TEST') - # TODO get_encodings, ustr and exception_to_unicode were originally from tools.misc. # There are here until we refactor tools so that this module doesn't depends on tools. diff --git a/openerp/modules/loading.py b/openerp/modules/loading.py index 07e5c28a925..350452e16c4 100644 --- a/openerp/modules/loading.py +++ b/openerp/modules/loading.py @@ -96,7 +96,7 @@ def load_module_graph(cr, graph, status=None, perform_checks=True, skip_modules= """ for filename in package.data[kind]: if kind == 'test': - _logger.log(logging.TEST, "module %s: loading %s", module_name, filename) + _logger.info("module %s: loading test %s", module_name, filename) else: _logger.info("module %s: loading %s", module_name, filename) _, ext = os.path.splitext(filename) diff --git a/openerp/modules/module.py b/openerp/modules/module.py index e71c1f1c519..9fdca4a9766 100644 --- a/openerp/modules/module.py +++ b/openerp/modules/module.py @@ -503,7 +503,7 @@ def run_unit_tests(module_name): for m in ms: suite.addTests(unittest2.TestLoader().loadTestsFromModule(m)) if ms: - _logger.log(logging.TEST, 'module %s: executing %s `fast_suite` and/or `checks` sub-modules', module_name, len(ms)) + _logger.info('module %s: executing %s `fast_suite` and/or `checks` sub-modules', module_name, len(ms)) # Use a custom stream object to log the test executions. class MyStream(object): def __init__(self): @@ -518,7 +518,7 @@ def run_unit_tests(module_name): if not first: c = '` ' + c first = False - _logger.log(logging.TEST, c) + _logger.info(c) result = unittest2.TextTestRunner(verbosity=2, stream=MyStream()).run(suite) if result.wasSuccessful(): return True diff --git a/openerp/netsvc.py b/openerp/netsvc.py index 6b66830b75e..7b971073275 100644 --- a/openerp/netsvc.py +++ b/openerp/netsvc.py @@ -63,7 +63,6 @@ COLOR_PATTERN = "%s%s%%s%s" % (COLOR_SEQ, COLOR_SEQ, RESET_SEQ) LEVEL_COLOR_MAPPING = { logging.DEBUG: (BLUE, DEFAULT), logging.INFO: (GREEN, DEFAULT), - logging.TEST: (WHITE, BLUE), logging.WARNING: (YELLOW, DEFAULT), logging.ERROR: (RED, DEFAULT), logging.CRITICAL: (WHITE, RED), @@ -161,7 +160,6 @@ PSEUDOCONFIG_MAPPER = { 'debug_rpc': ['openerp:DEBUG','openerp.netsvc.rpc.request:DEBUG'], 'debug': ['openerp:DEBUG'], 'debug_sql': ['openerp.sql_db:DEBUG'], - 'test': ['openerp:TEST'], 'info': [], 'warn': ['openerp:WARNING'], 'error': ['openerp:ERROR'], diff --git a/openerp/tools/config.py b/openerp/tools/config.py index 8fd85fa9dae..0ef288a7a3a 100644 --- a/openerp/tools/config.py +++ b/openerp/tools/config.py @@ -84,7 +84,7 @@ class configmanager(object): self.config_file = fname self.has_ssl = check_ssl() - self._LOGLEVELS = dict([(getattr(loglevels, 'LOG_%s' % x), getattr(logging, x)) for x in ('CRITICAL', 'ERROR', 'WARNING', 'INFO', 'TEST', 'DEBUG', 'NOTSET')]) + self._LOGLEVELS = dict([(getattr(loglevels, 'LOG_%s' % x), getattr(logging, x)) for x in ('CRITICAL', 'ERROR', 'WARNING', 'INFO', 'DEBUG', 'NOTSET')]) version = "%s %s" % (release.description, release.version) self.parser = parser = optparse.OptionParser(version=version, option_class=MyOption) diff --git a/openerp/tools/test_reports.py b/openerp/tools/test_reports.py index 9ec4dab6cc3..14deffb9ec2 100644 --- a/openerp/tools/test_reports.py +++ b/openerp/tools/test_reports.py @@ -49,7 +49,7 @@ def try_report(cr, uid, rname, ids, data=None, context=None, our_module=None): rname_s = rname[7:] else: rname_s = rname - _logger.log(netsvc.logging.TEST, " - Trying %s.create(%r)", rname, ids) + _logger.info(" - Trying %s.create(%r)", rname, ids) res = netsvc.LocalService(rname).create(cr, uid, ids, data, context) if not isinstance(res, tuple): raise RuntimeError("Result of %s.create() should be a (data,format) tuple, now it is a %s" % \ @@ -92,7 +92,7 @@ def try_report(cr, uid, rname, ids, data=None, context=None, our_module=None): _logger.warning("Report %s produced a \"%s\" chunk, cannot examine it", rname, res_format) return False - _logger.log(netsvc.logging.TEST, " + Report %s produced correctly.", rname) + _logger.info(" + Report %s produced correctly.", rname) return True def try_report_action(cr, uid, action_id, active_model=None, active_ids=None, @@ -126,7 +126,7 @@ def try_report_action(cr, uid, action_id, active_model=None, active_ids=None, pool = pooler.get_pool(cr.dbname) def log_test(msg, *args): - _logger.log(netsvc.logging.TEST, " - " + msg, *args) + _logger.info(" - " + msg, *args) datas = {} if active_model: diff --git a/openerp/tools/yaml_import.py b/openerp/tools/yaml_import.py index 3172caac1f4..2fffb07daaf 100644 --- a/openerp/tools/yaml_import.py +++ b/openerp/tools/yaml_import.py @@ -922,7 +922,7 @@ class YamlInterpreter(object): def yaml_import(cr, module, yamlfile, kind, idref=None, mode='init', noupdate=False, report=None): if idref is None: idref = {} - loglevel = logging.TEST if kind == 'test' else logging.DEBUG + loglevel = logging.INFO if kind == 'test' else logging.DEBUG yaml_string = yamlfile.read() yaml_interpreter = YamlInterpreter(cr, module, idref, mode, filename=yamlfile.name, report=report, noupdate=noupdate, loglevel=loglevel) yaml_interpreter.process(yaml_string) diff --git a/openerpcommand/initialize.py b/openerpcommand/initialize.py index 44fb084bd1e..9822dd5f5b2 100644 --- a/openerpcommand/initialize.py +++ b/openerpcommand/initialize.py @@ -47,7 +47,7 @@ def run(args): config = openerp.tools.config if args.tests: - config['log_handler'] = [':TEST'] + config['log_handler'] = [':INFO'] config['test_enable'] = True config['without_demo'] = False else: From a4fbd26541ddff9e89c20b4fde1fb6be07fa23dd Mon Sep 17 00:00:00 2001 From: Vo Minh Thu Date: Tue, 26 Mar 2013 17:20:40 +0100 Subject: [PATCH 23/34] [REF]: use openerp.workflow instead of LocalService("workflow"). bzr revid: vmt@openerp.com-20130326162040-kkq46wrur3pgn6eh --- openerp/addons/base/ir/ir_actions.py | 6 +++--- openerp/addons/base/ir/ir_model.py | 5 ++--- openerp/addons/base/ir/workflow/workflow.py | 8 +++----- openerp/modules/graph.py | 2 -- openerp/modules/migration.py | 2 -- openerp/tools/convert.py | 10 +++++----- openerp/tools/yaml_import.py | 5 ++--- 7 files changed, 15 insertions(+), 23 deletions(-) diff --git a/openerp/addons/base/ir/ir_actions.py b/openerp/addons/base/ir/ir_actions.py index 3e29a0a9b97..29cebd81823 100644 --- a/openerp/addons/base/ir/ir_actions.py +++ b/openerp/addons/base/ir/ir_actions.py @@ -26,13 +26,14 @@ from socket import gethostname import time from openerp import SUPERUSER_ID -from openerp import netsvc, tools +from openerp import tools from openerp.osv import fields, osv import openerp.report.interface from openerp.report.report_sxw import report_sxw, report_rml from openerp.tools.config import config from openerp.tools.safe_eval import safe_eval as eval from openerp.tools.translate import _ +import openerp.workflow _logger = logging.getLogger(__name__) @@ -645,12 +646,11 @@ class actions_server(osv.osv): _logger.warning('Failed to send email to: %s', addresses) if action.state == 'trigger': - wf_service = netsvc.LocalService("workflow") model = action.wkf_model_id.model m2o_field_name = action.trigger_obj_id.name target_id = obj_pool.read(cr, uid, context.get('active_id'), [m2o_field_name])[m2o_field_name] target_id = target_id[0] if isinstance(target_id,tuple) else target_id - wf_service.trg_validate(uid, model, int(target_id), action.trigger_name, cr) + openerp.workflow.trg_validate(uid, model, int(target_id), action.trigger_name, cr) if action.state == 'sms': #TODO: set the user and password from the system diff --git a/openerp/addons/base/ir/ir_model.py b/openerp/addons/base/ir/ir_model.py index b6bb0c5e227..088dfdd8a3a 100644 --- a/openerp/addons/base/ir/ir_model.py +++ b/openerp/addons/base/ir/ir_model.py @@ -26,7 +26,7 @@ import types import openerp from openerp import SUPERUSER_ID -from openerp import netsvc, pooler, tools +from openerp import pooler, tools from openerp.osv import fields,osv from openerp.osv.orm import Model from openerp.tools.safe_eval import safe_eval as eval @@ -1047,10 +1047,9 @@ class ir_model_data(osv.osv): wkf_todo.extend(cr.fetchall()) cr.execute("update wkf_transition set condition='True', group_id=NULL, signal=NULL,act_to=act_from,act_from=%s where act_to=%s", (res_id,res_id)) - wf_service = netsvc.LocalService("workflow") for model,res_id in wkf_todo: try: - wf_service.trg_write(uid, model, res_id, cr) + openerp.workflow.trg_write(uid, model, res_id, cr) except Exception: _logger.info('Unable to force processing of workflow for item %s@%s in order to leave activity to be deleted', res_id, model, exc_info=True) diff --git a/openerp/addons/base/ir/workflow/workflow.py b/openerp/addons/base/ir/workflow/workflow.py index 46884c5035b..0ce951940a9 100644 --- a/openerp/addons/base/ir/workflow/workflow.py +++ b/openerp/addons/base/ir/workflow/workflow.py @@ -21,7 +21,7 @@ from openerp.osv import fields, osv from openerp.tools.translate import _ -from openerp import netsvc +import openerp.workflow class workflow(osv.osv): _name = "workflow" @@ -40,8 +40,7 @@ class workflow(osv.osv): def write(self, cr, user, ids, vals, context=None): if not context: context={} - wf_service = netsvc.LocalService("workflow") - wf_service.clear_cache(cr, user) + openerp.workflow.clear_cache(cr, user) return super(workflow, self).write(cr, user, ids, vals, context=context) def get_active_workitems(self, cr, uid, res, res_id, context=None): @@ -62,8 +61,7 @@ class workflow(osv.osv): def create(self, cr, user, vals, context=None): if not context: context={} - wf_service = netsvc.LocalService("workflow") - wf_service.clear_cache(cr, user) + openerp.workflow.clear_cache(cr, user) return super(workflow, self).create(cr, user, vals, context=context) workflow() diff --git a/openerp/modules/graph.py b/openerp/modules/graph.py index 56b17e3239a..0e14480d8ac 100644 --- a/openerp/modules/graph.py +++ b/openerp/modules/graph.py @@ -36,8 +36,6 @@ from openerp.tools.safe_eval import safe_eval as eval import openerp.pooler as pooler from openerp.tools.translate import _ -import openerp.netsvc as netsvc - import zipfile import openerp.release as release diff --git a/openerp/modules/migration.py b/openerp/modules/migration.py index e0faa77c3a4..16de56879b9 100644 --- a/openerp/modules/migration.py +++ b/openerp/modules/migration.py @@ -36,8 +36,6 @@ from openerp.tools.safe_eval import safe_eval as eval import openerp.pooler as pooler from openerp.tools.translate import _ -import openerp.netsvc as netsvc - import zipfile import openerp.release as release diff --git a/openerp/tools/convert.py b/openerp/tools/convert.py index 59e66512da4..b462b6d6aef 100644 --- a/openerp/tools/convert.py +++ b/openerp/tools/convert.py @@ -29,7 +29,9 @@ import sys # for eval context: import time -import openerp.release as release + +import openerp.release +import openerp.workflow import assertion_report @@ -85,7 +87,7 @@ def _get_idref(self, cr, uid, model_str, context, idref): time=time, DateTime=datetime, timedelta=timedelta, - version=release.major_version, + version=openerp.release.major_version, ref=_ref(self, cr), pytz=pytz) if len(model_str): @@ -526,9 +528,7 @@ form: module.record_id""" % (xml_id,) id = _eval_xml(self, rec[0], self.pool, cr, self.uid, self.idref) uid = self.get_uid(cr, self.uid, data_node, rec) - import openerp.netsvc as netsvc - wf_service = netsvc.LocalService("workflow") - wf_service.trg_validate(uid, model, + openerp.workflow.trg_validate(uid, model, id, str(rec.get('action','')), cr) diff --git a/openerp/tools/yaml_import.py b/openerp/tools/yaml_import.py index 2fffb07daaf..5cad12d76c1 100644 --- a/openerp/tools/yaml_import.py +++ b/openerp/tools/yaml_import.py @@ -7,6 +7,7 @@ import logging import openerp.pooler as pooler import openerp.sql_db as sql_db +import openerp.workflow import misc from config import config import yaml_tag @@ -584,9 +585,7 @@ class YamlInterpreter(object): signals=[x['signal'] for x in self.cr.dictfetchall()] if workflow.action not in signals: raise YamlImportException('Incorrect action %s. No such action defined' % workflow.action) - import openerp.netsvc as netsvc - wf_service = netsvc.LocalService("workflow") - wf_service.trg_validate(uid, workflow.model, id, workflow.action, self.cr) + openerp.workflow.trg_validate(uid, workflow.model, id, workflow.action, self.cr) def _eval_params(self, model, params): args = [] From 4ebedfc25d147642a771c70582ba0d952673166f Mon Sep 17 00:00:00 2001 From: Vo Minh Thu Date: Tue, 26 Mar 2013 17:33:36 +0100 Subject: [PATCH 24/34] [REF] netsvc: it seems the re-exports from loglevels are no longer necessary. bzr revid: vmt@openerp.com-20130326163336-61jh2efakhg0gmoi --- openerp/netsvc.py | 2 -- 1 file changed, 2 deletions(-) diff --git a/openerp/netsvc.py b/openerp/netsvc.py index 7b971073275..bed7cd8c8d7 100644 --- a/openerp/netsvc.py +++ b/openerp/netsvc.py @@ -38,8 +38,6 @@ try: except ImportError: psutil = None -# TODO modules that import netsvc only for things from loglevels must be changed to use loglevels. -from loglevels import * import tools import openerp From 684bd3544243afcade742942c8d17f52772dfa61 Mon Sep 17 00:00:00 2001 From: Vo Minh Thu Date: Wed, 27 Mar 2013 10:31:25 +0100 Subject: [PATCH 25/34] [REF] registry: begin to remove openerp.pooler: - call openerp.modules.registry.RegistryManager instead - expose openerp.get_pool() bzr revid: vmt@openerp.com-20130327093125-iqsyvvjm0ej7do14 --- openerp/__init__.py | 14 +++++++++++++ openerp/cli/server.py | 12 ++++++----- openerp/modules/loading.py | 42 +++++++++++++++++++------------------- 3 files changed, 42 insertions(+), 26 deletions(-) diff --git a/openerp/__init__.py b/openerp/__init__.py index b9f4f71d76a..b7c09488996 100644 --- a/openerp/__init__.py +++ b/openerp/__init__.py @@ -53,5 +53,19 @@ multi_process = False # Is the server running with gevent. evented = False +def registry(database_name): + """ + Return the model registry for the given database. If the registry does not + exist yet, it is created on the fly. + """ + return modules.registry.RegistryManager.get(database_name) + +def new_registry(database_name): + """ + Return the model registry for the given database. If the registry already + existed, it is deleted and created again. + """ + return modules.registry.RegistryManager.new(database_name) + # vim:expandtab:smartindent:tabstop=4:softtabstop=4:shiftwidth=4: diff --git a/openerp/cli/server.py b/openerp/cli/server.py index dbb77d72ca6..9339e590b7c 100644 --- a/openerp/cli/server.py +++ b/openerp/cli/server.py @@ -95,7 +95,7 @@ def preload_registry(dbname): """ Preload a registry, and start the cron.""" try: update_module = True if openerp.tools.config['init'] or openerp.tools.config['update'] else False - db, registry = openerp.pooler.get_db_and_pool(dbname,update_module=update_module) + openerp.modules.registry.RegistryManager.new(dbname, update_module=update_module) except Exception: _logger.exception('Failed to initialize database `%s`.', dbname) @@ -103,8 +103,8 @@ def run_test_file(dbname, test_file): """ Preload a registry, possibly run a test file, and start the cron.""" try: config = openerp.tools.config - db, registry = openerp.pooler.get_db_and_pool(dbname, update_module=config['init'] or config['update']) - cr = db.cursor() + registry = openerp.modules.registry.RegistryManager.new(dbname, update_module=config['init'] or config['update']) + cr = registry.db.cursor() _logger.info('loading test file %s', test_file) openerp.tools.convert_yaml_import(cr, 'base', file(test_file), 'test', {}, 'test', True) cr.rollback() @@ -125,7 +125,8 @@ def export_translation(): fileformat = os.path.splitext(config["translate_out"])[-1][1:].lower() buf = file(config["translate_out"], "w") - cr = openerp.pooler.get_db(dbname).cursor() + registry = openerp.modules.registry.RegistryManager.new(dbname) + cr = registry.db.cursor() openerp.tools.trans_export(config["language"], config["translate_modules"] or ["all"], buf, fileformat, cr) cr.close() @@ -138,7 +139,8 @@ def import_translation(): context = {'overwrite': config["overwrite_existing_translations"]} dbname = config['db_name'] - cr = openerp.pooler.get_db(dbname).cursor() + registry = openerp.modules.registry.RegistryManager.new(dbname) + cr = registry.db.cursor() openerp.tools.trans_load( cr, config["translate_in"], config["language"], context=context) cr.commit() diff --git a/openerp/modules/loading.py b/openerp/modules/loading.py index 07e5c28a925..3394aed82bd 100644 --- a/openerp/modules/loading.py +++ b/openerp/modules/loading.py @@ -35,7 +35,6 @@ import openerp.modules.db import openerp.modules.graph import openerp.modules.migration import openerp.osv as osv -import openerp.pooler as pooler import openerp.tools as tools from openerp import SUPERUSER_ID @@ -129,17 +128,17 @@ def load_module_graph(cr, graph, status=None, perform_checks=True, skip_modules= processed_modules = [] loaded_modules = [] - pool = pooler.get_pool(cr.dbname) + registry = openerp.registry(cr.dbname) migrations = openerp.modules.migration.MigrationManager(cr, graph) _logger.debug('loading %d packages...', len(graph)) # Query manual fields for all models at once and save them on the registry # so the initialization code for each model does not have to do it # one model at a time. - pool.fields_by_model = {} + registry.fields_by_model = {} cr.execute('SELECT * FROM ir_model_fields WHERE state=%s', ('manual',)) for field in cr.dictfetchall(): - pool.fields_by_model.setdefault(field['model'], []).append(field) + registry.fields_by_model.setdefault(field['model'], []).append(field) # register, instantiate and initialize models for each modules for index, package in enumerate(graph): @@ -153,17 +152,17 @@ def load_module_graph(cr, graph, status=None, perform_checks=True, skip_modules= migrations.migrate_module(package, 'pre') load_openerp_module(package.name) - models = pool.load(cr, package) + models = registry.load(cr, package) loaded_modules.append(package.name) if hasattr(package, 'init') or hasattr(package, 'update') or package.state in ('to install', 'to upgrade'): init_module_models(cr, package.name, models) - pool._init_modules.add(package.name) + registry._init_modules.add(package.name) status['progress'] = float(index) / len(graph) # Can't put this line out of the loop: ir.module.module will be # registered by init_module_models() above. - modobj = pool.get('ir.module.module') + modobj = registry['ir.module.module'] if perform_checks: modobj.check(cr, SUPERUSER_ID, [module_id]) @@ -219,7 +218,7 @@ def load_module_graph(cr, graph, status=None, perform_checks=True, skip_modules= # The query won't be valid for models created later (i.e. custom model # created after the registry has been loaded), so empty its result. - pool.fields_by_model = None + registry.fields_by_model = None cr.commit() @@ -258,7 +257,7 @@ def load_marked_modules(cr, graph, states, force, progressdict, report, loaded_m def load_modules(db, force_demo=False, status=None, update_module=False): # TODO status['progress'] reporting is broken: used twice (and reset each # time to zero) in load_module_graph, not fine-grained enough. - # It should be a method exposed by the pool. + # It should be a method exposed by the registry. initialize_sys_path() force = [] @@ -275,8 +274,9 @@ def load_modules(db, force_demo=False, status=None, update_module=False): if not tools.config['without_demo']: tools.config["demo"]['all'] = 1 - # This is a brand new pool, just created in pooler.get_db_and_pool() - pool = pooler.get_pool(cr.dbname) + # This is a brand new registry, just created in + # openerp.modules.registry.RegistryManger.new(). + registry = openerp.registry(cr.dbname) if 'base' in tools.config['update'] or 'all' in tools.config['update']: cr.execute("update ir_module_module set state=%s where name=%s and state=%s", ('to upgrade', 'base', 'installed')) @@ -290,7 +290,7 @@ def load_modules(db, force_demo=False, status=None, update_module=False): # processed_modules: for cleanup step after install # loaded_modules: to avoid double loading - report = pool._assertion_report + report = registry._assertion_report loaded_modules, processed_modules = load_module_graph(cr, graph, status, perform_checks=update_module, report=report) if tools.config['load_language']: @@ -299,7 +299,7 @@ def load_modules(db, force_demo=False, status=None, update_module=False): # STEP 2: Mark other modules to be loaded/updated if update_module: - modobj = pool.get('ir.module.module') + modobj = registry['ir.module.module'] if ('base' in tools.config['init']) or ('base' in tools.config['update']): _logger.info('updating modules list') modobj.update_list(cr, SUPERUSER_ID) @@ -341,13 +341,13 @@ def load_modules(db, force_demo=False, status=None, update_module=False): # load custom models cr.execute('select model from ir_model where state=%s', ('manual',)) for model in cr.dictfetchall(): - pool.get('ir.model').instanciate(cr, SUPERUSER_ID, model['model'], {}) + registry['ir.model'].instanciate(cr, SUPERUSER_ID, model['model'], {}) # STEP 4: Finish and cleanup installations if processed_modules: cr.execute("""select model,name from ir_model where id NOT IN (select distinct model_id from ir_model_access)""") for (model, name) in cr.fetchall(): - model_obj = pool.get(model) + model_obj = registry.get(model) if model_obj and not model_obj.is_transient(): _logger.warning('The model %s has no access rules, consider adding one. E.g. access_%s,access_%s,model_%s,,1,1,1,1', model, model.replace('.', '_'), model.replace('.', '_'), model.replace('.', '_')) @@ -356,20 +356,20 @@ def load_modules(db, force_demo=False, status=None, update_module=False): # been replaced by owner-only access rights cr.execute("""select distinct mod.model, mod.name from ir_model_access acc, ir_model mod where acc.model_id = mod.id""") for (model, name) in cr.fetchall(): - model_obj = pool.get(model) + model_obj = registry.get(model) if model_obj and model_obj.is_transient(): _logger.warning('The transient model %s (%s) should not have explicit access rules!', model, name) cr.execute("SELECT model from ir_model") for (model,) in cr.fetchall(): - obj = pool.get(model) + obj = registry.get(model) if obj: obj._check_removed_columns(cr, log=True) else: _logger.warning("Model %s is declared but cannot be loaded! (Perhaps a module was partially removed or renamed)", model) # Cleanup orphan records - pool.get('ir.model.data')._process_end(cr, SUPERUSER_ID, processed_modules) + registry['ir.model.data']._process_end(cr, SUPERUSER_ID, processed_modules) for kind in ('init', 'demo', 'update'): tools.config[kind] = {} @@ -403,12 +403,12 @@ def load_modules(db, force_demo=False, status=None, update_module=False): cr.execute("SELECT id FROM ir_module_module WHERE state=%s", ('to remove',)) mod_ids_to_remove = [x[0] for x in cr.fetchall()] if mod_ids_to_remove: - pool.get('ir.module.module').module_uninstall(cr, SUPERUSER_ID, mod_ids_to_remove) + registry['ir.module.module'].module_uninstall(cr, SUPERUSER_ID, mod_ids_to_remove) # Recursive reload, should only happen once, because there should be no # modules to remove next time cr.commit() _logger.info('Reloading registry once more after uninstalling modules') - return pooler.restart_pool(cr.dbname, force_demo, status, update_module) + return openerp.modules.registry.RegistryManger.new(cr.dbname, force_demo, status, update_module) if report.failures: _logger.error('At least one test failed when loading the modules.') @@ -416,7 +416,7 @@ def load_modules(db, force_demo=False, status=None, update_module=False): _logger.info('Modules loaded.') # STEP 7: call _register_hook on every model - for model in pool.models.values(): + for model in registry.models.values(): model._register_hook(cr) finally: From 1e7e2ca753185e7cb0608073d94c4d23b729d0f4 Mon Sep 17 00:00:00 2001 From: Vo Minh Thu Date: Wed, 27 Mar 2013 12:10:14 +0100 Subject: [PATCH 26/34] [REF] no longer use openerp.pooler. Either use openerp.modules.registry.RegistryManager when the full new() signature is needed, or use openerp.registry(). Replaced also some pool.get() with pool[] because KeyErrors are better than AttributeErrors on None. bzr revid: vmt@openerp.com-20130327111014-2i0hlvpy5y5ku7hm --- openerp/addons/base/ir/ir_cron.py | 4 +- openerp/addons/base/ir/ir_model.py | 50 +++++++------- openerp/addons/base/module/module.py | 8 +-- .../base/module/wizard/base_module_upgrade.py | 4 +- openerp/addons/base/res/res_config.py | 32 ++++----- openerp/addons/base/res/res_partner.py | 20 +++--- openerp/addons/base/res/res_users.py | 32 ++++----- openerp/modules/graph.py | 1 - openerp/modules/migration.py | 1 - openerp/report/custom.py | 28 ++++---- openerp/report/interface.py | 11 +-- openerp/report/print_xml.py | 10 +-- openerp/report/printscreen/ps_form.py | 6 +- openerp/report/printscreen/ps_list.py | 15 ++-- openerp/report/report_sxw.py | 31 +++++---- openerp/service/common.py | 3 +- openerp/service/db.py | 14 ++-- openerp/service/model.py | 20 +++--- openerp/service/report.py | 6 +- openerp/service/security.py | 17 ++--- openerp/sql_db.py | 2 - openerp/tools/convert.py | 68 +++++++++---------- openerp/tools/mail.py | 6 +- openerp/tools/test_reports.py | 16 ++--- openerp/tools/translate.py | 43 ++++++------ openerp/tools/yaml_import.py | 46 ++++++------- openerp/workflow/wkf_expr.py | 10 +-- 27 files changed, 246 insertions(+), 258 deletions(-) diff --git a/openerp/addons/base/ir/ir_cron.py b/openerp/addons/base/ir/ir_cron.py index d86eb10f3d8..c3f7ccc7dd2 100644 --- a/openerp/addons/base/ir/ir_cron.py +++ b/openerp/addons/base/ir/ir_cron.py @@ -123,7 +123,7 @@ class ir_cron(osv.osv): try: args = str2tuple(args) openerp.modules.registry.RegistryManager.check_registry_signaling(cr.dbname) - registry = openerp.pooler.get_pool(cr.dbname) + registry = openerp.registry(cr.dbname) model = registry.get(model_name) if model and hasattr(model, method_name): method = getattr(model, method_name) @@ -223,7 +223,7 @@ class ir_cron(osv.osv): _logger.debug('Starting job `%s`.', job['name']) job_cr = db.cursor() try: - registry = openerp.pooler.get_pool(db_name) + registry = openerp.registry(db_name) registry[cls._name]._process_job(job_cr, job, lock_cr) except Exception: _logger.exception('Unexpected exception while processing cron job %r', job) diff --git a/openerp/addons/base/ir/ir_model.py b/openerp/addons/base/ir/ir_model.py index b6bb0c5e227..a2664e62485 100644 --- a/openerp/addons/base/ir/ir_model.py +++ b/openerp/addons/base/ir/ir_model.py @@ -26,7 +26,7 @@ import types import openerp from openerp import SUPERUSER_ID -from openerp import netsvc, pooler, tools +from openerp import netsvc, tools from openerp.osv import fields,osv from openerp.osv.orm import Model from openerp.tools.safe_eval import safe_eval as eval @@ -50,7 +50,7 @@ def _get_fields_type(self, cr, uid, context=None): def _in_modules(self, cr, uid, ids, field_name, arg, context=None): #pseudo-method used by fields.function in ir.model/ir.model.fields - module_pool = self.pool.get("ir.module.module") + module_pool = self.pool["ir.module.module"] installed_module_ids = module_pool.search(cr, uid, [('state','=','installed')]) installed_module_names = module_pool.read(cr, uid, installed_module_ids, ['name'], context=context) installed_modules = set(x['name'] for x in installed_module_names) @@ -71,7 +71,7 @@ class ir_model(osv.osv): res = dict.fromkeys(ids) for model in models: if self.pool.get(model.model): - res[model.id] = self.pool.get(model.model).is_transient() + res[model.id] = self.pool[model.model].is_transient() else: _logger.error('Missing model %s' % (model.model, )) return res @@ -91,7 +91,7 @@ class ir_model(osv.osv): models = self.browse(cr, uid, ids) res = {} for model in models: - res[model.id] = self.pool.get("ir.ui.view").search(cr, uid, [('model', '=', model.model)]) + res[model.id] = self.pool["ir.ui.view"].search(cr, uid, [('model', '=', model.model)]) return res _columns = { @@ -144,7 +144,7 @@ class ir_model(osv.osv): def _drop_table(self, cr, uid, ids, context=None): for model in self.browse(cr, uid, ids, context): - model_pool = self.pool.get(model.model) + model_pool = self.pool[model.model] cr.execute('select relkind from pg_class where relname=%s', (model_pool._table,)) result = cr.fetchone() if result and result[0] == 'v': @@ -168,7 +168,7 @@ class ir_model(osv.osv): if not context.get(MODULE_UNINSTALL_FLAG): # only reload pool for normal unlink. For module uninstall the # reload is done independently in openerp.modules.loading - pooler.restart_pool(cr.dbname) + openerp.new_registry(cr.dbname) return res @@ -193,8 +193,8 @@ class ir_model(osv.osv): field_name=vals['name'], field_state='manual', select=vals.get('select_level', '0')) - self.pool.get(vals['model'])._auto_init(cr, ctx) - #pooler.restart_pool(cr.dbname) + self.pool[vals['model']]._auto_init(cr, ctx) + # openerp.new_registry(cr.dbname) return res def instanciate(self, cr, user, model, context=None): @@ -298,7 +298,7 @@ class ir_model_fields(osv.osv): def _drop_column(self, cr, uid, ids, context=None): for field in self.browse(cr, uid, ids, context): - model = self.pool.get(field.model) + model = self.pool[field.model] cr.execute('select relkind from pg_class where relname=%s', (model._table,)) result = cr.fetchone() cr.execute("SELECT column_name FROM information_schema.columns WHERE table_name ='%s' and column_name='%s'" %(model._table, field.name)) @@ -323,7 +323,7 @@ class ir_model_fields(osv.osv): def create(self, cr, user, vals, context=None): if 'model_id' in vals: - model_data = self.pool.get('ir.model').browse(cr, user, vals['model_id']) + model_data = self.pool['ir.model'].browse(cr, user, vals['model_id']) vals['model'] = model_data.model if context is None: context = {} @@ -338,18 +338,18 @@ class ir_model_fields(osv.osv): if not vals['name'].startswith('x_'): raise except_orm(_('Error'), _("Custom fields must have a name that starts with 'x_' !")) - if vals.get('relation',False) and not self.pool.get('ir.model').search(cr, user, [('model','=',vals['relation'])]): + if vals.get('relation',False) and not self.pool['ir.model'].search(cr, user, [('model','=',vals['relation'])]): raise except_orm(_('Error'), _("Model %s does not exist!") % vals['relation']) if self.pool.get(vals['model']): - self.pool.get(vals['model']).__init__(self.pool, cr) + self.pool[vals['model']].__init__(self.pool, cr) #Added context to _auto_init for special treatment to custom field for select_level ctx = dict(context, field_name=vals['name'], field_state='manual', select=vals.get('select_level', '0'), update_custom_fields=True) - self.pool.get(vals['model'])._auto_init(cr, ctx) + self.pool[vals['model']]._auto_init(cr, ctx) return res @@ -498,7 +498,7 @@ class ir_model_constraint(Model): Delete PostgreSQL foreign keys and constraints tracked by this model. """ - if uid != SUPERUSER_ID and not self.pool.get('ir.model.access').check_groups(cr, uid, "base.group_system"): + if uid != SUPERUSER_ID and not self.pool['ir.model.access'].check_groups(cr, uid, "base.group_system"): raise except_orm(_('Permission Denied'), (_('Administrator access is required to uninstall a module'))) context = dict(context or {}) @@ -559,7 +559,7 @@ class ir_model_relation(Model): Delete PostgreSQL many2many relations tracked by this model. """ - if uid != SUPERUSER_ID and not self.pool.get('ir.model.access').check_groups(cr, uid, "base.group_system"): + if uid != SUPERUSER_ID and not self.pool['ir.model.access'].check_groups(cr, uid, "base.group_system"): raise except_orm(_('Permission Denied'), (_('Administrator access is required to uninstall a module'))) ids_set = set(ids) @@ -685,7 +685,7 @@ class ir_model_access(osv.osv): # TransientModel records have no access rights, only an implicit access rule if not self.pool.get(model_name): _logger.error('Missing model %s' % (model_name, )) - elif self.pool.get(model_name).is_transient(): + elif self.pool[model_name].is_transient(): return True # We check if a specific rule exists @@ -793,7 +793,7 @@ class ir_model_data(osv.osv): for model in result: try: - r = dict(self.pool.get(model).name_get(cr, uid, result[model].keys(), context=context)) + r = dict(self.pool[model].name_get(cr, uid, result[model].keys(), context=context)) for key,val in result[model].items(): result2[val] = r.get(key, False) except: @@ -867,7 +867,7 @@ class ir_model_data(osv.osv): def get_object(self, cr, uid, module, xml_id, context=None): """Returns a browsable record for the given module name and xml_id or raise ValueError if not found""" res_model, res_id = self.get_object_reference(cr, uid, module, xml_id) - result = self.pool.get(res_model).browse(cr, uid, res_id, context=context) + result = self.pool[res_model].browse(cr, uid, res_id, context=context) if not result.exists(): raise ValueError('No record found for unique ID %s.%s. It may have been deleted.' % (module, xml_id)) return result @@ -1001,7 +1001,7 @@ class ir_model_data(osv.osv): cr.execute('select * from ir_values where model=%s and key=%s and name=%s'+where,(model, key, name)) res = cr.fetchone() if not res: - ir_values_obj = pooler.get_pool(cr.dbname).get('ir.values') + ir_values_obj = openerp.registry(cr.dbname)['ir.values'] ir_values_obj.set(cr, uid, key, key2, name, models, value, replace, isobject, meta) elif xml_id: cr.execute('UPDATE ir_values set value=%s WHERE model=%s and key=%s and name=%s'+where,(value, model, key, name)) @@ -1020,7 +1020,7 @@ class ir_model_data(osv.osv): ids = self.search(cr, uid, [('module', 'in', modules_to_remove)]) - if uid != 1 and not self.pool.get('ir.model.access').check_groups(cr, uid, "base.group_system"): + if uid != 1 and not self.pool['ir.model.access'].check_groups(cr, uid, "base.group_system"): raise except_orm(_('Permission Denied'), (_('Administrator access is required to uninstall a module'))) context = dict(context or {}) @@ -1063,7 +1063,7 @@ class ir_model_data(osv.osv): if model == 'ir.model.fields': # Don't remove the LOG_ACCESS_COLUMNS unless _log_access # has been turned off on the model. - field = self.pool.get(model).browse(cr, uid, [res_id], context=context)[0] + field = self.pool[model].browse(cr, uid, [res_id], context=context)[0] if field.name in openerp.osv.orm.LOG_ACCESS_COLUMNS and self.pool[field.model]._log_access: continue if field.name == 'id': @@ -1071,7 +1071,7 @@ class ir_model_data(osv.osv): _logger.info('Deleting %s@%s', res_id, model) try: cr.execute('SAVEPOINT record_unlink_save') - self.pool.get(model).unlink(cr, uid, [res_id], context=context) + self.pool[model].unlink(cr, uid, [res_id], context=context) except Exception: _logger.info('Unable to delete %s@%s', res_id, model, exc_info=True) cr.execute('ROLLBACK TO SAVEPOINT record_unlink_save') @@ -1084,8 +1084,8 @@ class ir_model_data(osv.osv): unlink_if_refcount((model, res_id) for model, res_id in to_unlink if model == 'ir.model.fields') - ir_model_relation = self.pool.get('ir.model.relation') - ir_module_module = self.pool.get('ir.module.module') + ir_model_relation = self.pool['ir.model.relation'] + ir_module_module = self.pool['ir.module.module'] modules_to_remove_ids = ir_module_module.search(cr, uid, [('name', 'in', modules_to_remove)]) relation_ids = ir_model_relation.search(cr, uid, [('module', 'in', modules_to_remove_ids)]) ir_model_relation._module_data_uninstall(cr, uid, relation_ids, context) @@ -1118,6 +1118,6 @@ class ir_model_data(osv.osv): for (model, res_id) in to_unlink: if self.pool.get(model): _logger.info('Deleting %s@%s', res_id, model) - self.pool.get(model).unlink(cr, uid, [res_id]) + self.pool[model].unlink(cr, uid, [res_id]) # vim:expandtab:smartindent:tabstop=4:softtabstop=4:shiftwidth=4: diff --git a/openerp/addons/base/module/module.py b/openerp/addons/base/module/module.py index a0d1eedef2b..7e370e86f0e 100644 --- a/openerp/addons/base/module/module.py +++ b/openerp/addons/base/module/module.py @@ -39,7 +39,7 @@ except ImportError: from StringIO import StringIO # NOQA import openerp -from openerp import modules, pooler, tools, addons +from openerp import modules, tools, addons from openerp.modules.db import create_categories from openerp.tools.parse_version import parse_version from openerp.tools.translate import _ @@ -473,14 +473,14 @@ class module(osv.osv): function(cr, uid, ids, context=context) cr.commit() - _, pool = pooler.restart_pool(cr.dbname, update_module=True) + registry = openerp.modules.registry.RegistryManager.new(cr.dbname, update_module=True) - config = pool.get('res.config').next(cr, uid, [], context=context) or {} + config = registry['res.config'].next(cr, uid, [], context=context) or {} if config.get('type') not in ('ir.actions.act_window_close',): return config # reload the client; open the first available root menu - menu_obj = self.pool.get('ir.ui.menu') + menu_obj = registry['ir.ui.menu'] menu_ids = menu_obj.search(cr, uid, [('parent_id', '=', False)], context=context) return { 'type': 'ir.actions.client', diff --git a/openerp/addons/base/module/wizard/base_module_upgrade.py b/openerp/addons/base/module/wizard/base_module_upgrade.py index bd6b9b7640d..c081663d8ed 100644 --- a/openerp/addons/base/module/wizard/base_module_upgrade.py +++ b/openerp/addons/base/module/wizard/base_module_upgrade.py @@ -19,7 +19,7 @@ # ############################################################################## -from openerp import pooler +import openerp from openerp.osv import osv, fields from openerp.tools.translate import _ @@ -87,7 +87,7 @@ class base_module_upgrade(osv.osv_memory): ir_module.download(cr, uid, ids, context=context) cr.commit() # save before re-creating cursor below - pooler.restart_pool(cr.dbname, update_module=True) + openerp.modules.registry.RegistryManager.new(cr.dbname, update_module=True) ir_model_data = self.pool.get('ir.model.data') __, res_id = ir_model_data.get_object_reference(cr, uid, 'base', 'view_base_module_upgrade_install') diff --git a/openerp/addons/base/res/res_config.py b/openerp/addons/base/res/res_config.py index bfa9abe5607..1a5806ad93b 100644 --- a/openerp/addons/base/res/res_config.py +++ b/openerp/addons/base/res/res_config.py @@ -23,7 +23,7 @@ from operator import attrgetter import re import openerp -from openerp import pooler, SUPERUSER_ID +from openerp import SUPERUSER_ID from openerp.osv import osv, fields from openerp.tools import ustr from openerp.tools.translate import _ @@ -72,7 +72,7 @@ class res_config_configurable(osv.osv_memory): res['nodestroy'] = False return res # reload the client; open the first available root menu - menu_obj = self.pool.get('ir.ui.menu') + menu_obj = self.pool['ir.ui.menu'] menu_ids = menu_obj.search(cr, uid, [('parent_id', '=', False)], context=context) return { 'type': 'ir.actions.client', @@ -271,7 +271,7 @@ class res_config_installer(osv.osv_memory): :returns: a list of all installed modules in this installer :rtype: [browse_record] """ - modules = self.pool.get('ir.module.module') + modules = self.pool['ir.module.module'] selectable = [field for field in self._columns if type(self._columns[field]) is fields.boolean] @@ -353,7 +353,7 @@ class res_config_installer(osv.osv_memory): return fields def execute(self, cr, uid, ids, context=None): - modules = self.pool.get('ir.module.module') + modules = self.pool['ir.module.module'] to_install = list(self.modules_to_install( cr, uid, ids, context=context)) _logger.info('Selecting addons %s to install', to_install) @@ -363,7 +363,7 @@ class res_config_installer(osv.osv_memory): 'to install', ['uninstalled'], context=context) cr.commit() openerp.modules.registry.RegistryManager.signal_registry_change(cr.dbname) - new_db, self.pool = pooler.restart_pool(cr.dbname, update_module=True) + openerp.modules.registry.RegistryManager.new(cr.dbname, update_module=True) res_config_installer() @@ -455,8 +455,8 @@ class res_config_settings(osv.osv_memory): 'other': ['other_field', ...], } """ - ir_model_data = self.pool.get('ir.model.data') - ir_module = self.pool.get('ir.module.module') + ir_model_data = self.pool['ir.model.data'] + ir_module = self.pool['ir.module.module'] def ref(xml_id): mod, xml = xml_id.split('.', 1) return ir_model_data.get_object(cr, uid, mod, xml, context) @@ -478,7 +478,7 @@ class res_config_settings(osv.osv_memory): return {'default': defaults, 'group': groups, 'module': modules, 'other': others} def default_get(self, cr, uid, fields, context=None): - ir_values = self.pool.get('ir.values') + ir_values = self.pool['ir.values'] classified = self._get_classified_fields(cr, uid, context) res = super(res_config_settings, self).default_get(cr, uid, fields, context) @@ -505,8 +505,8 @@ class res_config_settings(osv.osv_memory): return res def execute(self, cr, uid, ids, context=None): - ir_values = self.pool.get('ir.values') - ir_module = self.pool.get('ir.module.module') + ir_values = self.pool['ir.values'] + ir_module = self.pool['ir.module.module'] classified = self._get_classified_fields(cr, uid, context) config = self.browse(cr, uid, ids[0], context) @@ -572,7 +572,7 @@ class res_config_settings(osv.osv_memory): def cancel(self, cr, uid, ids, context=None): # ignore the current record, and send the action to reopen the view - act_window = self.pool.get('ir.actions.act_window') + act_window = self.pool['ir.actions.act_window'] action_ids = act_window.search(cr, uid, [('res_model', '=', self._name)]) if action_ids: return act_window.read(cr, uid, action_ids[0], [], context=context) @@ -588,7 +588,7 @@ class res_config_settings(osv.osv_memory): if isinstance(ids, (int, long)): ids = [ids] - act_window = self.pool.get('ir.actions.act_window') + act_window = self.pool['ir.actions.act_window'] action_ids = act_window.search(cr, uid, [('res_model', '=', self._name)], context=context) name = self._name if action_ids: @@ -606,8 +606,8 @@ class res_config_settings(osv.osv_memory): - t[1]: long: id of the menuitem's action """ module_name, menu_xml_id = menu_xml_id.split('.') - dummy, menu_id = self.pool.get('ir.model.data').get_object_reference(cr, uid, module_name, menu_xml_id) - ir_ui_menu = self.pool.get('ir.ui.menu').browse(cr, uid, menu_id, context=context) + dummy, menu_id = self.pool['ir.model.data'].get_object_reference(cr, uid, module_name, menu_xml_id) + ir_ui_menu = self.pool['ir.ui.menu'].browse(cr, uid, menu_id, context=context) return (ir_ui_menu.complete_name, ir_ui_menu.action.id) @@ -621,7 +621,7 @@ class res_config_settings(osv.osv_memory): """ model_name, field_name = full_field_name.rsplit('.', 1) - return self.pool.get(model_name).fields_get(cr, uid, allfields=[field_name], context=context)[field_name]['string'] + return self.pool[model_name].fields_get(cr, uid, allfields=[field_name], context=context)[field_name]['string'] def get_config_warning(self, cr, msg, context=None): """ @@ -652,7 +652,7 @@ class res_config_settings(osv.osv_memory): Cannot find any account journal of %s type for this company.\n\nYou can create one in the %%(menu:account.menu_account_config)s. """ - res_config_obj = pooler.get_pool(cr.dbname).get('res.config.settings') + res_config_obj = openerp.registry(cr.dbname)['res.config.settings'] regex_path = r'%\(((?:menu|field):[a-z_\.]*)\)s' # Process the message diff --git a/openerp/addons/base/res/res_partner.py b/openerp/addons/base/res/res_partner.py index d6e554b598d..aef2af80d5f 100644 --- a/openerp/addons/base/res/res_partner.py +++ b/openerp/addons/base/res/res_partner.py @@ -27,13 +27,13 @@ import re import openerp from openerp import SUPERUSER_ID -from openerp import pooler, tools +from openerp import tools from openerp.osv import osv, fields from openerp.tools.translate import _ class format_address(object): def fields_view_get_address(self, cr, uid, arch, context={}): - user_obj = self.pool.get('res.users') + user_obj = self.pool['res.users'] fmt = user_obj.browse(cr, SUPERUSER_ID, uid, context).company_id.country_id fmt = fmt and fmt.address_format layouts = { @@ -154,7 +154,7 @@ class res_partner_title(osv.osv): } def _lang_get(self, cr, uid, context=None): - lang_pool = self.pool.get('res.lang') + lang_pool = self.pool['res.lang'] ids = lang_pool.search(cr, uid, [], context=context) res = lang_pool.read(cr, uid, ids, ['code', 'name'], context) return [(r['code'], r['name']) for r in res] @@ -287,7 +287,7 @@ class res_partner(osv.osv, format_address): def fields_view_get(self, cr, user, view_id=None, view_type='form', context=None, toolbar=False, submenu=False): if (not view_id) and (view_type=='form') and context and context.get('force_email', False): - view_id = self.pool.get('ir.model.data').get_object_reference(cr, user, 'base', 'view_partner_simple_form')[1] + view_id = self.pool['ir.model.data'].get_object_reference(cr, user, 'base', 'view_partner_simple_form')[1] res = super(res_partner,self).fields_view_get(cr, user, view_id, view_type, context, toolbar=toolbar, submenu=submenu) if view_type == 'form': res['arch'] = self.fields_view_get_address(cr, user, res['arch'], context=context) @@ -299,7 +299,7 @@ class res_partner(osv.osv, format_address): 'tz': lambda self, cr, uid, ctx: ctx.get('tz', False), 'customer': True, 'category_id': _default_category, - 'company_id': lambda self, cr, uid, ctx: self.pool.get('res.company')._company_default_get(cr, uid, 'res.partner', context=ctx), + 'company_id': lambda self, cr, uid, ctx: self.pool['res.company']._company_default_get(cr, uid, 'res.partner', context=ctx), 'color': 0, 'is_company': False, 'type': 'default', @@ -336,12 +336,12 @@ class res_partner(osv.osv, format_address): def onchange_state(self, cr, uid, ids, state_id, context=None): if state_id: - country_id = self.pool.get('res.country.state').browse(cr, uid, state_id, context).country_id.id + country_id = self.pool['res.country.state'].browse(cr, uid, state_id, context).country_id.id return {'value':{'country_id':country_id}} return {} def _check_ean_key(self, cr, uid, ids, context=None): - for partner_o in pooler.get_pool(cr.dbname).get('res.partner').read(cr, uid, ids, ['ean13',]): + for partner_o in self.pool['res.partner'].read(cr, uid, ids, ['ean13',]): thisean=partner_o['ean13'] if thisean and thisean!='': if len(thisean)!=13: @@ -487,7 +487,7 @@ class res_partner(osv.osv, format_address): def email_send(self, cr, uid, ids, email_from, subject, body, on_error=''): while len(ids): - self.pool.get('ir.cron').create(cr, uid, { + self.pool['ir.cron'].create(cr, uid, { 'name': 'Send Partner Emails', 'user_id': uid, 'model': 'res.partner', @@ -523,12 +523,12 @@ class res_partner(osv.osv, format_address): if res: return res if not context.get('category_id', False): return False - return _('Partners: ')+self.pool.get('res.partner.category').browse(cr, uid, context['category_id'], context).name + return _('Partners: ')+self.pool['res.partner.category'].browse(cr, uid, context['category_id'], context).name def main_partner(self, cr, uid): ''' Return the id of the main partner ''' - model_data = self.pool.get('ir.model.data') + model_data = self.pool['ir.model.data'] return model_data.browse(cr, uid, model_data.search(cr, uid, [('module','=','base'), ('name','=','main_partner')])[0], diff --git a/openerp/addons/base/res/res_users.py b/openerp/addons/base/res/res_users.py index 4c1d1317e07..063996bec72 100644 --- a/openerp/addons/base/res/res_users.py +++ b/openerp/addons/base/res/res_users.py @@ -26,7 +26,7 @@ from lxml.builder import E import openerp from openerp import SUPERUSER_ID -from openerp import pooler, tools +from openerp import tools import openerp.exceptions from openerp.osv import fields,osv from openerp.osv.orm import browse_record @@ -98,7 +98,7 @@ class groups(osv.osv): raise osv.except_osv(_('Error'), _('The name of the group can not start with "-"')) res = super(groups, self).write(cr, uid, ids, vals, context=context) - self.pool.get('ir.model.access').call_cache_clearing_methods(cr) + self.pool['ir.model.access'].call_cache_clearing_methods(cr) return res groups() @@ -178,7 +178,7 @@ class res_users(osv.osv): partner.onchange_type method, but applied to the user object. """ partner_ids = [user.partner_id.id for user in self.browse(cr, uid, ids, context=context)] - return self.pool.get('res.partner').onchange_type(cr, uid, partner_ids, is_company, context=context) + return self.pool['res.partner'].onchange_type(cr, uid, partner_ids, is_company, context=context) def onchange_address(self, cr, uid, ids, use_parent_address, parent_id, context=None): """ Wrapper on the user.partner onchange_address, because some calls to the @@ -186,7 +186,7 @@ class res_users(osv.osv): partner.onchange_type method, but applied to the user object. """ partner_ids = [user.partner_id.id for user in self.browse(cr, uid, ids, context=context)] - return self.pool.get('res.partner').onchange_address(cr, uid, partner_ids, use_parent_address, parent_id, context=context) + return self.pool['res.partner'].onchange_address(cr, uid, partner_ids, use_parent_address, parent_id, context=context) def _check_company(self, cr, uid, ids, context=None): return all(((this.company_id in this.company_ids) or not this.company_ids) for this in self.browse(cr, uid, ids, context)) @@ -202,7 +202,7 @@ class res_users(osv.osv): def _get_company(self,cr, uid, context=None, uid2=False): if not uid2: uid2 = uid - user = self.pool.get('res.users').read(cr, uid, uid2, ['company_id'], context) + user = self.pool['res.users'].read(cr, uid, uid2, ['company_id'], context) company_id = user.get('company_id', False) return company_id and company_id[0] or False @@ -243,7 +243,7 @@ class res_users(osv.osv): 'company_id': _get_company, 'company_ids': _get_companies, 'groups_id': _get_group, - 'image': lambda self, cr, uid, ctx={}: self.pool.get('res.partner')._get_default_image(cr, uid, False, ctx, colorize=True), + 'image': lambda self, cr, uid, ctx={}: self.pool['res.partner']._get_default_image(cr, uid, False, ctx, colorize=True), } # User can write on a few of his own fields (but not his groups for example) @@ -266,7 +266,7 @@ class res_users(osv.osv): uid = SUPERUSER_ID result = super(res_users, self).read(cr, uid, ids, fields=fields, context=context, load=load) - canwrite = self.pool.get('ir.model.access').check(cr, uid, 'res.users', 'write', False) + canwrite = self.pool['ir.model.access'].check(cr, uid, 'res.users', 'write', False) if not canwrite: if isinstance(ids, (int, long)): result = override_password(result) @@ -291,8 +291,8 @@ class res_users(osv.osv): res = super(res_users, self).write(cr, uid, ids, values, context=context) # clear caches linked to the users - self.pool.get('ir.model.access').call_cache_clearing_methods(cr) - clear = partial(self.pool.get('ir.rule').clear_cache, cr) + self.pool['ir.model.access'].call_cache_clearing_methods(cr) + clear = partial(self.pool['ir.rule'].clear_cache, cr) map(clear, ids) db = cr.dbname if db in self._uid_cache: @@ -352,7 +352,7 @@ class res_users(osv.osv): return result def action_get(self, cr, uid, context=None): - dataobj = self.pool.get('ir.model.data') + dataobj = self.pool['ir.model.data'] data_id = dataobj._get_id(cr, SUPERUSER_ID, 'base', 'action_res_users_my') return dataobj.browse(cr, uid, data_id, context=context).res_id @@ -372,7 +372,7 @@ class res_users(osv.osv): if not password: return False user_id = False - cr = pooler.get_db(db).cursor() + cr = self.pool.db.cursor() try: # autocommit: our single update request will be performed atomically. # (In this way, there is no opportunity to have two transactions @@ -423,10 +423,10 @@ class res_users(osv.osv): # Successfully logged in as admin! # Attempt to guess the web base url... if user_agent_env and user_agent_env.get('base_location'): - cr = pooler.get_db(db).cursor() + cr = self.pool.db.cursor() try: base = user_agent_env['base_location'] - self.pool.get('ir.config_parameter').set_param(cr, uid, 'web.base.url', base) + self.pool['ir.config_parameter'].set_param(cr, uid, 'web.base.url', base) cr.commit() except Exception: _logger.exception("Failed to update web.base.url configuration parameter") @@ -442,7 +442,7 @@ class res_users(osv.osv): raise openerp.exceptions.AccessDenied() if self._uid_cache.get(db, {}).get(uid) == passwd: return - cr = pooler.get_db(db).cursor() + cr = self.pool.db.cursor() try: self.check_credentials(cr, uid, passwd) if self._uid_cache.has_key(db): @@ -690,7 +690,7 @@ class groups_view(osv.osv): def get_user_groups_view(self, cr, uid, context=None): try: - view = self.pool.get('ir.model.data').get_object(cr, SUPERUSER_ID, 'base', 'user_groups_view', context) + view = self.pool['ir.model.data'].get_object(cr, SUPERUSER_ID, 'base', 'user_groups_view', context) assert view and view._table_name == 'ir.ui.view' except Exception: view = False @@ -826,7 +826,7 @@ class users_view(osv.osv): def fields_get(self, cr, uid, allfields=None, context=None, write_access=True): res = super(users_view, self).fields_get(cr, uid, allfields, context, write_access) # add reified groups fields - for app, kind, gs in self.pool.get('res.groups').get_groups_by_application(cr, uid, context): + for app, kind, gs in self.pool['res.groups'].get_groups_by_application(cr, uid, context): if kind == 'selection': # selection group field tips = ['%s: %s' % (g.name, g.comment) for g in gs if g.comment] diff --git a/openerp/modules/graph.py b/openerp/modules/graph.py index 56b17e3239a..d527ddafa4a 100644 --- a/openerp/modules/graph.py +++ b/openerp/modules/graph.py @@ -33,7 +33,6 @@ import openerp.osv as osv import openerp.tools as tools import openerp.tools.osutil as osutil from openerp.tools.safe_eval import safe_eval as eval -import openerp.pooler as pooler from openerp.tools.translate import _ import openerp.netsvc as netsvc diff --git a/openerp/modules/migration.py b/openerp/modules/migration.py index e0faa77c3a4..c9c7aefa03b 100644 --- a/openerp/modules/migration.py +++ b/openerp/modules/migration.py @@ -33,7 +33,6 @@ import openerp.osv as osv import openerp.tools as tools import openerp.tools.osutil as osutil from openerp.tools.safe_eval import safe_eval as eval -import openerp.pooler as pooler from openerp.tools.translate import _ import openerp.netsvc as netsvc diff --git a/openerp/report/custom.py b/openerp/report/custom.py index c3d0ff810b7..84634d1dc25 100644 --- a/openerp/report/custom.py +++ b/openerp/report/custom.py @@ -22,6 +22,7 @@ import os import time +import openerp import openerp.tools as tools from openerp.tools.safe_eval import safe_eval as eval import print_xml @@ -31,7 +32,6 @@ import common from openerp.osv.osv import except_osv from openerp.osv.orm import browse_null from openerp.osv.orm import browse_record_list -import openerp.pooler as pooler from pychart import * import misc import cStringIO @@ -127,22 +127,22 @@ class report_custom(report_int): def create(self, cr, uid, ids, datas, context=None): if not context: context={} - self.pool = pooler.get_pool(cr.dbname) - report = self.pool.get('ir.report.custom').browse(cr, uid, [datas['report_id']])[0] + self.pool = openerp.registry(cr.dbname) + report = self.pool['ir.report.custom'].browse(cr, uid, [datas['report_id']])[0] datas['model'] = report.model_id.model if report.menu_id: - ids = self.pool.get(report.model_id.model).search(cr, uid, []) + ids = self.pool[report.model_id.model].search(cr, uid, []) datas['ids'] = ids report_id = datas['report_id'] - report = self.pool.get('ir.report.custom').read(cr, uid, [report_id], context=context)[0] - fields = self.pool.get('ir.report.custom.fields').read(cr, uid, report['fields_child0'], context=context) + report = self.pool['ir.report.custom'].read(cr, uid, [report_id], context=context)[0] + fields = self.pool['ir.report.custom.fields'].read(cr, uid, report['fields_child0'], context=context) fields.sort(lambda x,y : x['sequence'] - y['sequence']) if report['field_parent']: - parent_field = self.pool.get('ir.model.fields').read(cr, uid, [report['field_parent'][0]], ['model']) - model_name = self.pool.get('ir.model').read(cr, uid, [report['model_id'][0]], ['model'], context=context)[0]['model'] + parent_field = self.pool['ir.model.fields'].read(cr, uid, [report['field_parent'][0]], ['model']) + model_name = self.pool['ir.model'].read(cr, uid, [report['model_id'][0]], ['model'], context=context)[0]['model'] fct = { 'id': lambda x: x, @@ -158,7 +158,7 @@ class report_custom(report_int): field_child = f['field_child'+str(i)] if field_child: row.append( - self.pool.get('ir.model.fields').read(cr, uid, [field_child[0]], ['name'], context=context)[0]['name'] + self.pool['ir.model.fields'].read(cr, uid, [field_child[0]], ['name'], context=context)[0]['name'] ) if f['fc'+str(i)+'_operande']: fct_name = 'id' @@ -171,7 +171,7 @@ class report_custom(report_int): cond.append(None) new_fields.append(row) new_cond.append(cond) - objs = self.pool.get(model_name).browse(cr, uid, ids) + objs = self.pool[model_name].browse(cr, uid, ids) # Group by groupby = None @@ -340,7 +340,7 @@ class report_custom(report_int): def _create_lines(self, cr, uid, ids, report, fields, results, context): - pool = pooler.get_pool(cr.dbname) + pool = openerp.registry(cr.dbname) pdf_string = cStringIO.StringIO() can = canvas.init(fname=pdf_string, format='pdf') @@ -371,7 +371,7 @@ class report_custom(report_int): for f in fields: field_id = (f['field_child3'] and f['field_child3'][0]) or (f['field_child2'] and f['field_child2'][0]) or (f['field_child1'] and f['field_child1'][0]) or (f['field_child0'] and f['field_child0'][0]) if field_id: - type = pool.get('ir.model.fields').read(cr, uid, [field_id],['ttype']) + type = pool['ir.model.fields'].read(cr, uid, [field_id],['ttype']) if type[0]['ttype'] == 'date': date_idx = idx fct[idx] = process_date[report['frequency']] @@ -444,7 +444,7 @@ class report_custom(report_int): def _create_bars(self, cr, uid, ids, report, fields, results, context): - pool = pooler.get_pool(cr.dbname) + pool = openerp.registry(cr.dbname) pdf_string = cStringIO.StringIO() can = canvas.init(fname=pdf_string, format='pdf') @@ -472,7 +472,7 @@ class report_custom(report_int): for f in fields: field_id = (f['field_child3'] and f['field_child3'][0]) or (f['field_child2'] and f['field_child2'][0]) or (f['field_child1'] and f['field_child1'][0]) or (f['field_child0'] and f['field_child0'][0]) if field_id: - type = pool.get('ir.model.fields').read(cr, uid, [field_id],['ttype']) + type = pool['ir.model.fields'].read(cr, uid, [field_id],['ttype']) if type[0]['ttype'] == 'date': date_idx = idx fct[idx] = process_date[report['frequency']] diff --git a/openerp/report/interface.py b/openerp/report/interface.py index f0de9631800..1c42bbb06c5 100644 --- a/openerp/report/interface.py +++ b/openerp/report/interface.py @@ -23,7 +23,8 @@ import os import re from lxml import etree -import openerp.pooler as pooler + +import openerp import openerp.tools as tools import openerp.modules @@ -90,8 +91,8 @@ class report_rml(report_int): if report_type == 'raw': return xml, report_type rml = self.create_rml(cr, xml, uid, context) - pool = pooler.get_pool(cr.dbname) - ir_actions_report_xml_obj = pool.get('ir.actions.report.xml') + registry = openerp.registry(cr.dbname) + ir_actions_report_xml_obj = registry['ir.actions.report.xml'] report_xml_ids = ir_actions_report_xml_obj.search(cr, uid, [('report_name', '=', self.name[7:])], context=context) self.title = report_xml_ids and ir_actions_report_xml_obj.browse(cr,uid,report_xml_ids)[0].name or 'OpenERP Report' create_doc = self.generators[report_type] @@ -140,8 +141,8 @@ class report_rml(report_int): self.internal_header=True if not context: context={} - pool = pooler.get_pool(cr.dbname) - ir_translation_obj = pool.get('ir.translation') + registry = openerp.registry(cr.dbname) + ir_translation_obj = registry['ir.translation'] # In some case we might not use xsl ... if not self.xsl: diff --git a/openerp/report/print_xml.py b/openerp/report/print_xml.py index c2af0984c2e..f4191498aa8 100644 --- a/openerp/report/print_xml.py +++ b/openerp/report/print_xml.py @@ -20,11 +20,11 @@ ############################################################################## from lxml import etree +import openerp import openerp.tools as tools from openerp.tools.safe_eval import safe_eval import print_fnc from openerp.osv.orm import browse_null, browse_record -import openerp.pooler as pooler class InheritDict(dict): # Might be usefull when we're doing name lookup for call or eval. @@ -54,7 +54,7 @@ class document(object): def __init__(self, cr, uid, datas, func=False): # create a new document self.cr = cr - self.pool = pooler.get_pool(cr.dbname) + self.pool = openerp.registry(cr.dbname) self.func = func or {} self.datas = datas self.uid = uid @@ -134,8 +134,8 @@ class document(object): value = self.get_value(browser, attrs['name']) - ids = self.pool.get('ir.attachment').search(self.cr, self.uid, [('res_model','=',model),('res_id','=',int(value))]) - datas = self.pool.get('ir.attachment').read(self.cr, self.uid, ids) + ids = self.pool['ir.attachment'].search(self.cr, self.uid, [('res_model','=',model),('res_id','=',int(value))]) + datas = self.pool['ir.attachment'].read(self.cr, self.uid, ids) if len(datas): # if there are several, pick first @@ -264,7 +264,7 @@ class document(object): def parse_tree(self, ids, model, context=None): if not context: context={} - browser = self.pool.get(model).browse(self.cr, self.uid, ids, context) + browser = self.pool[model].browse(self.cr, self.uid, ids, context) self.parse_node(self.dom, self.doc, browser) def parse_string(self, xml, ids, model, context=None): diff --git a/openerp/report/printscreen/ps_form.py b/openerp/report/printscreen/ps_form.py index e585176d515..b3934457e2f 100644 --- a/openerp/report/printscreen/ps_form.py +++ b/openerp/report/printscreen/ps_form.py @@ -19,8 +19,8 @@ # ############################################################################## +import openerp from openerp.report.interface import report_int -import openerp.pooler as pooler import openerp.tools as tools from openerp.report import render @@ -55,8 +55,8 @@ class report_printscreen_list(report_int): if not context: context={} datas['ids'] = ids - pool = pooler.get_pool(cr.dbname) - model = pool.get(datas['model']) + registry = openerp.registry(cr.dbname) + model = registry[datas['model']] # title come from description of model which are specified in py file. self.title = model._description result = model.fields_view_get(cr, uid, view_type='form', context=context) diff --git a/openerp/report/printscreen/ps_list.py b/openerp/report/printscreen/ps_list.py index c26597c8cdf..fa6bd29a6a6 100644 --- a/openerp/report/printscreen/ps_list.py +++ b/openerp/report/printscreen/ps_list.py @@ -19,8 +19,8 @@ # ############################################################################## +import openerp from openerp.report.interface import report_int -import openerp.pooler as pooler import openerp.tools as tools from openerp.tools.safe_eval import safe_eval as eval from lxml import etree @@ -66,12 +66,12 @@ class report_printscreen_list(report_int): self.context = context self.groupby = context.get('group_by',[]) self.groupby_no_leaf = context.get('group_by_no_leaf',False) - pool = pooler.get_pool(cr.dbname) - model = pool.get(datas['model']) - model_id = pool.get('ir.model').search(cr, uid, [('model','=',model._name)]) + registry = openerp.registry(cr.dbname) + model = registry[datas['model']] + model_id = registry['ir.model'].search(cr, uid, [('model','=',model._name)]) model_desc = model._description if model_id: - model_desc = pool.get('ir.model').browse(cr, uid, model_id[0], context).name + model_desc = registry['ir.model'].browse(cr, uid, model_id[0], context).name self.title = model_desc datas['ids'] = ids result = model.fields_view_get(cr, uid, view_type='tree', context=context) @@ -134,8 +134,9 @@ class report_printscreen_list(report_int): _append_node('PageHeight', '%.2f' %(pageSize[1] * 2.8346,)) _append_node('report-header', title) - _append_node('company', pooler.get_pool(self.cr.dbname).get('res.users').browse(self.cr,uid,uid).company_id.name) - rpt_obj = pooler.get_pool(self.cr.dbname).get('res.users') + registry = openerp.registry(self.cr.dbname) + _append_node('company', registry['res.users'].browse(self.cr,uid,uid).company_id.name) + rpt_obj = registry['res.users'] rml_obj=report_sxw.rml_parse(self.cr, uid, rpt_obj._name,context) _append_node('header-date', str(rml_obj.formatLang(time.strftime("%Y-%m-%d"),date=True))+' ' + str(time.strftime("%H:%M"))) l = [] diff --git a/openerp/report/report_sxw.py b/openerp/report/report_sxw.py index 325690205ef..1387aba6c5a 100644 --- a/openerp/report/report_sxw.py +++ b/openerp/report/report_sxw.py @@ -29,10 +29,11 @@ import time from interface import report_rml import preprocess import logging -import openerp.pooler as pooler import openerp.tools as tools import zipfile import common + +import openerp from openerp.osv.fields import float as float_field, function as function_field, datetime as datetime_field from openerp.tools.translate import _ from openerp.tools import DEFAULT_SERVER_DATE_FORMAT, DEFAULT_SERVER_DATETIME_FORMAT @@ -152,8 +153,8 @@ class rml_parse(object): context={} self.cr = cr self.uid = uid - self.pool = pooler.get_pool(cr.dbname) - user = self.pool.get('res.users').browse(cr, uid, uid, context=context) + self.pool = openerp.registry(cr.dbname) + user = self.pool['res.users'].browse(cr, uid, uid, context=context) self.localcontext = { 'user': user, 'setCompany': self.setCompany, @@ -220,7 +221,7 @@ class rml_parse(object): model = 'ir.attachment' try : id = int(id) - res = self.pool.get(model).read(self.cr,self.uid,id) + res = self.pool[model].read(self.cr,self.uid,id) if field : return res[field] elif model =='ir.attachment' : @@ -237,7 +238,7 @@ class rml_parse(object): obj._context['lang'] = lang def _get_lang_dict(self): - pool_lang = self.pool.get('res.lang') + pool_lang = self.pool['res.lang'] lang = self.localcontext.get('lang', 'en_US') or 'en_US' lang_ids = pool_lang.search(self.cr,self.uid,[('code','=',lang)])[0] lang_obj = pool_lang.browse(self.cr,self.uid,lang_ids) @@ -252,7 +253,7 @@ class rml_parse(object): def get_digits(self, obj=None, f=None, dp=None): d = DEFAULT_DIGITS = 2 if dp: - decimal_precision_obj = self.pool.get('decimal.precision') + decimal_precision_obj = self.pool['decimal.precision'] ids = decimal_precision_obj.search(self.cr, self.uid, [('name', '=', dp)]) if ids: d = decimal_precision_obj.browse(self.cr, self.uid, ids)[0].digits @@ -323,7 +324,7 @@ class rml_parse(object): return res def display_address(self, address_browse_record): - return self.pool.get('res.partner')._display_address(self.cr, self.uid, address_browse_record) + return self.pool['res.partner']._display_address(self.cr, self.uid, address_browse_record) def repeatIn(self, lst, name,nodes_parent=False): ret_lst = [] @@ -334,7 +335,7 @@ class rml_parse(object): def _translate(self,text): lang = self.localcontext['lang'] if lang and text and not text.isspace(): - transl_obj = self.pool.get('ir.translation') + transl_obj = self.pool['ir.translation'] piece_list = self._transl_regex.split(text) for pn in range(len(piece_list)): if not self._transl_regex.match(piece_list[pn]): @@ -399,7 +400,7 @@ class report_sxw(report_rml, preprocess.report): self.internal_header=True def getObjects(self, cr, uid, ids, context): - table_obj = pooler.get_pool(cr.dbname).get(self.table) + table_obj = openerp.registry(cr.dbname)[self.table] return table_obj.browse(cr, uid, ids, list_class=browse_record_list, context=context, fields_process=_fields_process) def create(self, cr, uid, ids, data, context=None): @@ -409,8 +410,8 @@ class report_sxw(report_rml, preprocess.report): context.update(internal_header=self.internal_header) # skip osv.fields.sanitize_binary_value() because we want the raw bytes in all cases context.update(bin_raw=True) - pool = pooler.get_pool(cr.dbname) - ir_obj = pool.get('ir.actions.report.xml') + registry = openerp.registry(cr.dbname) + ir_obj = registry['ir.actions.report.xml'] report_xml_ids = ir_obj.search(cr, uid, [('report_name', '=', self.name[7:])], context=context) if report_xml_ids: @@ -458,7 +459,7 @@ class report_sxw(report_rml, preprocess.report): def create_source_pdf(self, cr, uid, ids, data, report_xml, context=None): if not context: context={} - pool = pooler.get_pool(cr.dbname) + registry = openerp.registry(cr.dbname) attach = report_xml.attachment if attach: objs = self.getObjects(cr, uid, ids, context) @@ -467,9 +468,9 @@ class report_sxw(report_rml, preprocess.report): aname = eval(attach, {'object':obj, 'time':time}) result = False if report_xml.attachment_use and aname and context.get('attachment_use', True): - aids = pool.get('ir.attachment').search(cr, uid, [('datas_fname','=',aname+'.pdf'),('res_model','=',self.table),('res_id','=',obj.id)]) + aids = registry['ir.attachment'].search(cr, uid, [('datas_fname','=',aname+'.pdf'),('res_model','=',self.table),('res_id','=',obj.id)]) if aids: - brow_rec = pool.get('ir.attachment').browse(cr, uid, aids[0]) + brow_rec = registry['ir.attachment'].browse(cr, uid, aids[0]) if not brow_rec.datas: continue d = base64.decodestring(brow_rec.datas) @@ -487,7 +488,7 @@ class report_sxw(report_rml, preprocess.report): # field. ctx = dict(context) ctx.pop('default_type', None) - pool.get('ir.attachment').create(cr, uid, { + registry['ir.attachment'].create(cr, uid, { 'name': aname, 'datas': base64.encodestring(result[0]), 'datas_fname': name, diff --git a/openerp/service/common.py b/openerp/service/common.py index f06ab3fe5aa..685d602a10d 100644 --- a/openerp/service/common.py +++ b/openerp/service/common.py @@ -4,7 +4,6 @@ import logging import threading import openerp.osv.orm # TODO use openerp.exceptions -import openerp.pooler import openerp.release import openerp.tools @@ -43,7 +42,7 @@ def exp_login(db, login, password): return res or False def exp_authenticate(db, login, password, user_agent_env): - res_users = openerp.pooler.get_pool(db).get('res.users') + res_users = openerp.registry(db)['res.users'] return res_users.authenticate(db, login, password, user_agent_env) def exp_version(): diff --git a/openerp/service/db.py b/openerp/service/db.py index 7293e17c3c5..c440720b6fc 100644 --- a/openerp/service/db.py +++ b/openerp/service/db.py @@ -7,8 +7,8 @@ import os import threading import traceback +import openerp from openerp import SUPERUSER_ID -import openerp.pooler import openerp.release import openerp.sql_db import openerp.tools @@ -28,7 +28,7 @@ def _initialize_db(id, db_name, demo, lang, user_password): try: self_actions[id]['progress'] = 0 cr = openerp.sql_db.db_connect(db_name).cursor() - openerp.modules.db.initialize(cr) # TODO this should be removed as it is done by pooler.restart_pool. + openerp.modules.db.initialize(cr) # TODO this should be removed as it is done by RegistryManager.new(). openerp.tools.config['lang'] = lang cr.commit() finally: @@ -36,20 +36,20 @@ def _initialize_db(id, db_name, demo, lang, user_password): cr.close() cr = None - pool = openerp.pooler.restart_pool(db_name, demo, self_actions[id], - update_module=True)[1] + registry = openerp.modules.registry.RegistryManager.new( + db_name, demo, self_actions[id], update_module=True)[1] try: cr = openerp.sql_db.db_connect(db_name).cursor() if lang: - modobj = pool.get('ir.module.module') + modobj = registry['ir.module.module'] mids = modobj.search(cr, SUPERUSER_ID, [('state', '=', 'installed')]) modobj.update_translations(cr, SUPERUSER_ID, mids, lang) # update admin's password and lang values = {'password': user_password, 'lang': lang} - pool.get('res.users').write(cr, SUPERUSER_ID, [SUPERUSER_ID], values) + registry['res.users'].write(cr, SUPERUSER_ID, [SUPERUSER_ID], values) cr.execute('SELECT login, password FROM res_users ORDER BY login') self_actions[id].update(users=cr.dictfetchall(), clean=True) @@ -351,7 +351,7 @@ def exp_migrate_databases(databases): for db in databases: _logger.info('migrate database %s', db) openerp.tools.config['update']['base'] = True - openerp.pooler.restart_pool(db, force_demo=False, update_module=True) + openerp.modules.registry.RegistryManager.new(db, force_demo=False, update_module=True) return True # vim:expandtab:smartindent:tabstop=4:softtabstop=4:shiftwidth=4: diff --git a/openerp/service/model.py b/openerp/service/model.py index 976af76bc93..79f0ace4f2b 100644 --- a/openerp/service/model.py +++ b/openerp/service/model.py @@ -61,7 +61,7 @@ def check(f): # callable. We need to find the right parameters to call # the orm._sql_message(self, cr, uid, ids, context) function, # or we skip.. - # our signature is f(osv_pool, dbname [,uid, obj, method, args]) + # our signature is f(registry, dbname [,uid, obj, method, args]) try: if args and len(args) > 1: # TODO self doesn't exist, but was already wrong before (it was not a registry but just the object_service. @@ -95,14 +95,14 @@ def check(f): return tr(src, 'code') try: - if openerp.pooler.get_pool(dbname)._init: + if openerp.registry(dbname)._init: raise openerp.exceptions.Warning('Currently, this database is not fully loaded and can not be used.') return f(dbname, *args, **kwargs) except IntegrityError, inst: - osv_pool = openerp.pooler.get_pool(dbname) - for key in osv_pool._sql_error.keys(): + registry = openerp.registry(dbname) + for key in registry._sql_error.keys(): if key in inst[0]: - raise openerp.osv.orm.except_orm(_('Constraint Error'), tr(osv_pool._sql_error[key], 'sql_constraint') or inst[0]) + raise openerp.osv.orm.except_orm(_('Constraint Error'), tr(registry._sql_error[key], 'sql_constraint') or inst[0]) if inst.pgcode in (errorcodes.NOT_NULL_VIOLATION, errorcodes.FOREIGN_KEY_VIOLATION, errorcodes.RESTRICT_VIOLATION): msg = _('The operation cannot be completed, probably due to the following:\n- deletion: you may be trying to delete a record while other records still reference it\n- creation/update: a mandatory field is not correctly set') _logger.debug("IntegrityError", exc_info=True) @@ -116,7 +116,7 @@ def check(f): last_quote_begin = errortxt.rfind('"', 0, last_quote_end) model_name = table = errortxt[last_quote_begin+1:last_quote_end].strip() model = table.replace("_",".") - model_obj = osv_pool.get(model) + model_obj = registry.get(model) if model_obj: model_name = model_obj._description or model_obj._name msg += _('\n\n[object with reference: %s - %s]') % (model_name, model) @@ -129,7 +129,7 @@ def check(f): return wrapper def execute_cr(cr, uid, obj, method, *args, **kw): - object = openerp.pooler.get_pool(cr.dbname).get(obj) + object = openerp.registry(cr.dbname).get(obj) if not object: raise except_orm('Object Error', 'Object %s doesn\'t exist' % str(obj)) return getattr(object, method)(cr, uid, *args, **kw) @@ -140,7 +140,7 @@ def execute_kw(db, uid, obj, method, args, kw=None): @check def execute(db, uid, obj, method, *args, **kw): threading.currentThread().dbname = db - cr = openerp.pooler.get_db(db).cursor() + cr = openerp.registry(db).db.cursor() try: try: if method.startswith('_'): @@ -157,7 +157,7 @@ def execute(db, uid, obj, method, *args, **kw): return res def exec_workflow_cr(cr, uid, obj, signal, *args): - object = openerp.pooler.get_pool(cr.dbname).get(obj) + object = openerp.registry(cr.dbname).get(obj) if not object: raise except_orm('Object Error', 'Object %s doesn\'t exist' % str(obj)) res_id = args[0] @@ -165,7 +165,7 @@ def exec_workflow_cr(cr, uid, obj, signal, *args): @check def exec_workflow(db, uid, obj, signal, *args): - cr = openerp.pooler.get_db(db).cursor() + cr = openerp.registry(db).db.cursor() try: try: res = exec_workflow_cr(cr, uid, obj, signal, *args) diff --git a/openerp/service/report.py b/openerp/service/report.py index c20c7f0d7ec..0f3434fbb71 100644 --- a/openerp/service/report.py +++ b/openerp/service/report.py @@ -5,8 +5,8 @@ import logging import sys import threading +import openerp import openerp.netsvc -import openerp.pooler from openerp import tools import security @@ -49,7 +49,7 @@ def exp_render_report(db, uid, object, ids, datas=None, context=None): self_reports[id] = {'uid': uid, 'result': False, 'state': False, 'exception': None} - cr = openerp.pooler.get_db(db).cursor() + cr = openerp.registry(db).db.cursor() try: obj = openerp.netsvc.LocalService('report.'+object) (result, format) = obj.create(cr, uid, ids, datas, context) @@ -88,7 +88,7 @@ def exp_report(db, uid, object, ids, datas=None, context=None): self_reports[id] = {'uid': uid, 'result': False, 'state': False, 'exception': None} def go(id, uid, ids, datas, context): - cr = openerp.pooler.get_db(db).cursor() + cr = openerp.registry(db).db.cursor() try: obj = openerp.netsvc.LocalService('report.'+object) (result, format) = obj.create(cr, uid, ids, datas, context) diff --git a/openerp/service/security.py b/openerp/service/security.py index 849796da8bf..6f115b8030a 100644 --- a/openerp/service/security.py +++ b/openerp/service/security.py @@ -19,25 +19,20 @@ # ############################################################################## -import openerp.exceptions -import openerp.pooler as pooler -import openerp.tools as tools - +import openerp def login(db, login, password): - pool = pooler.get_pool(db) - user_obj = pool.get('res.users') - return user_obj.login(db, login, password) + res_users = openerp.registry(db)['res.users'] + return res_users.login(db, login, password) def check_super(passwd): - if passwd == tools.config['admin_passwd']: + if passwd == openerp.tools.config['admin_passwd']: return True else: raise openerp.exceptions.AccessDenied() def check(db, uid, passwd): - pool = pooler.get_pool(db) - user_obj = pool.get('res.users') - return user_obj.check(db, uid, passwd) + res_users = openerp.registry(db)['res.users'] + return res_users.check(db, uid, passwd) # vim:expandtab:smartindent:tabstop=4:softtabstop=4:shiftwidth=4: diff --git a/openerp/sql_db.py b/openerp/sql_db.py index 77c873b3482..c27784433c0 100644 --- a/openerp/sql_db.py +++ b/openerp/sql_db.py @@ -25,8 +25,6 @@ The PostgreSQL connector is a connectivity layer between the OpenERP code and the database, *not* a database abstraction toolkit. Database abstraction is what the ORM does, in fact. - -See also: the `pooler` module """ diff --git a/openerp/tools/convert.py b/openerp/tools/convert.py index 59e66512da4..6d2de82bd1e 100644 --- a/openerp/tools/convert.py +++ b/openerp/tools/convert.py @@ -29,6 +29,7 @@ import sys # for eval context: import time +import openerp import openerp.release as release import assertion_report @@ -47,7 +48,6 @@ except: from datetime import datetime, timedelta from lxml import etree import misc -import openerp.pooler as pooler from config import config from translate import _ @@ -77,7 +77,7 @@ def _ref(self, cr): return lambda x: self.id_get(cr, x) def _obj(pool, cr, uid, model_str, context=None): - model = pool.get(model_str) + model = pool[model_str] return lambda x: model.browse(cr, uid, x, context=context) def _get_idref(self, cr, uid, model_str, context, idref): @@ -124,10 +124,10 @@ def _eval_xml(self, node, pool, cr, uid, idref, context=None): if f_search: idref2 = _get_idref(self, cr, uid, f_model, context, idref) q = unsafe_eval(f_search, idref2) - ids = pool.get(f_model).search(cr, uid, q) + ids = pool[f_model].search(cr, uid, q) if f_use != 'id': - ids = map(lambda x: x[f_use], pool.get(f_model).read(cr, uid, ids, [f_use])) - _cols = pool.get(f_model)._columns + ids = map(lambda x: x[f_use], pool[f_model].read(cr, uid, ids, [f_use])) + _cols = pool[f_model]._columns if (f_name in _cols) and _cols[f_name]._type=='many2many': return ids f_val = False @@ -196,7 +196,7 @@ def _eval_xml(self, node, pool, cr, uid, idref, context=None): return_val = _eval_xml(self,n, pool, cr, uid, idref, context) if return_val is not None: args.append(return_val) - model = pool.get(node.get('model','')) + model = pool[node.get('model','')] method = node.get('name','') res = getattr(model, method)(cr, uid, *args) return res @@ -256,7 +256,7 @@ class xml_import(object): maximum one dot. They are used to refer to other modules ID, in the form: module.record_id""" % (xml_id,) if module != self.module: - modcnt = self.pool.get('ir.module.module').search_count(self.cr, self.uid, ['&', ('name', '=', module), ('state', 'in', ['installed'])]) + modcnt = self.pool['ir.module.module'].search_count(self.cr, self.uid, ['&', ('name', '=', module), ('state', 'in', ['installed'])]) assert modcnt == 1, """The ID "%s" refers to an uninstalled module""" % (xml_id,) if len(id) > 64: @@ -270,7 +270,7 @@ form: module.record_id""" % (xml_id,) if d_search: idref = _get_idref(self, cr, self.uid, d_model, context={}, idref={}) - ids = self.pool.get(d_model).search(cr, self.uid, unsafe_eval(d_search, idref)) + ids = self.pool[d_model].search(cr, self.uid, unsafe_eval(d_search, idref)) if d_id: try: ids.append(self.id_get(cr, d_id)) @@ -278,10 +278,10 @@ form: module.record_id""" % (xml_id,) # d_id cannot be found. doesn't matter in this case pass if ids: - self.pool.get(d_model).unlink(cr, self.uid, ids) + self.pool[d_model].unlink(cr, self.uid, ids) def _remove_ir_values(self, cr, name, value, model): - ir_values_obj = self.pool.get('ir.values') + ir_values_obj = self.pool['ir.values'] ir_value_ids = ir_values_obj.search(cr, self.uid, [('name','=',name),('value','=',value),('model','=',model)]) if ir_value_ids: ir_values_obj.unlink(cr, self.uid, ir_value_ids) @@ -324,14 +324,14 @@ form: module.record_id""" % (xml_id,) groups_value.append((4, group_id)) res['groups_id'] = groups_value - id = self.pool.get('ir.model.data')._update(cr, self.uid, "ir.actions.report.xml", self.module, res, xml_id, noupdate=self.isnoupdate(data_node), mode=self.mode) + id = self.pool['ir.model.data']._update(cr, self.uid, "ir.actions.report.xml", self.module, res, xml_id, noupdate=self.isnoupdate(data_node), mode=self.mode) self.idref[xml_id] = int(id) if not rec.get('menu') or eval(rec.get('menu','False')): keyword = str(rec.get('keyword', 'client_print_multi')) value = 'ir.actions.report.xml,'+str(id) replace = rec.get('replace', True) - self.pool.get('ir.model.data').ir_set(cr, self.uid, 'action', keyword, res['name'], [res['model']], value, replace=replace, isobject=True, xml_id=xml_id) + self.pool['ir.model.data'].ir_set(cr, self.uid, 'action', keyword, res['name'], [res['model']], value, replace=replace, isobject=True, xml_id=xml_id) elif self.mode=='update' and eval(rec.get('menu','False'))==False: # Special check for report having attribute menu=False on update value = 'ir.actions.report.xml,'+str(id) @@ -367,14 +367,14 @@ form: module.record_id""" % (xml_id,) groups_value.append((4, group_id)) res['groups_id'] = groups_value - id = self.pool.get('ir.model.data')._update(cr, self.uid, "ir.actions.wizard", self.module, res, xml_id, noupdate=self.isnoupdate(data_node), mode=self.mode) + id = self.pool['ir.model.data']._update(cr, self.uid, "ir.actions.wizard", self.module, res, xml_id, noupdate=self.isnoupdate(data_node), mode=self.mode) self.idref[xml_id] = int(id) # ir_set if (not rec.get('menu') or eval(rec.get('menu','False'))) and id: keyword = str(rec.get('keyword','') or 'client_action_multi') value = 'ir.actions.wizard,'+str(id) replace = rec.get("replace",'') or True - self.pool.get('ir.model.data').ir_set(cr, self.uid, 'action', keyword, string, [model], value, replace=replace, isobject=True, xml_id=xml_id) + self.pool['ir.model.data'].ir_set(cr, self.uid, 'action', keyword, string, [model], value, replace=replace, isobject=True, xml_id=xml_id) elif self.mode=='update' and (rec.get('menu') and eval(rec.get('menu','False'))==False): # Special check for wizard having attribute menu=False on update value = 'ir.actions.wizard,'+str(id) @@ -389,7 +389,7 @@ form: module.record_id""" % (xml_id,) res = {'name': name, 'url': url, 'target':target} - id = self.pool.get('ir.model.data')._update(cr, self.uid, "ir.actions.act_url", self.module, res, xml_id, noupdate=self.isnoupdate(data_node), mode=self.mode) + id = self.pool['ir.model.data']._update(cr, self.uid, "ir.actions.act_url", self.module, res, xml_id, noupdate=self.isnoupdate(data_node), mode=self.mode) self.idref[xml_id] = int(id) def _tag_act_window(self, cr, rec, data_node=None): @@ -489,7 +489,7 @@ form: module.record_id""" % (xml_id,) res['target'] = rec.get('target','') if rec.get('multi'): res['multi'] = rec.get('multi', False) - id = self.pool.get('ir.model.data')._update(cr, self.uid, 'ir.actions.act_window', self.module, res, xml_id, noupdate=self.isnoupdate(data_node), mode=self.mode) + id = self.pool['ir.model.data']._update(cr, self.uid, 'ir.actions.act_window', self.module, res, xml_id, noupdate=self.isnoupdate(data_node), mode=self.mode) self.idref[xml_id] = int(id) if src_model: @@ -497,7 +497,7 @@ form: module.record_id""" % (xml_id,) keyword = rec.get('key2','').encode('utf-8') or 'client_action_relate' value = 'ir.actions.act_window,'+str(id) replace = rec.get('replace','') or True - self.pool.get('ir.model.data').ir_set(cr, self.uid, 'action', keyword, xml_id, [src_model], value, replace=replace, isobject=True, xml_id=xml_id) + self.pool['ir.model.data'].ir_set(cr, self.uid, 'action', keyword, xml_id, [src_model], value, replace=replace, isobject=True, xml_id=xml_id) # TODO add remove ir.model.data def _tag_ir_set(self, cr, rec, data_node=None): @@ -508,7 +508,7 @@ form: module.record_id""" % (xml_id,) f_name = field.get("name",'').encode('utf-8') f_val = _eval_xml(self,field,self.pool, cr, self.uid, self.idref) res[f_name] = f_val - self.pool.get('ir.model.data').ir_set(cr, self.uid, res['key'], res['key2'], res['name'], res['models'], res['value'], replace=res.get('replace',True), isobject=res.get('isobject', False), meta=res.get('meta',None)) + self.pool['ir.model.data'].ir_set(cr, self.uid, res['key'], res['key2'], res['name'], res['models'], res['value'], replace=res.get('replace',True), isobject=res.get('isobject', False), meta=res.get('meta',None)) def _tag_workflow(self, cr, rec, data_node=None): if self.isnoupdate(data_node) and self.mode != 'init': @@ -563,7 +563,7 @@ form: module.record_id""" % (xml_id,) else: # the menuitem does't exist but we are in branch (not a leaf) _logger.warning('Warning no ID for submenu %s of menu %s !', menu_elem, str(m_l)) - pid = self.pool.get('ir.ui.menu').create(cr, self.uid, {'parent_id' : pid, 'name' : menu_elem}) + pid = self.pool['ir.ui.menu'].create(cr, self.uid, {'parent_id' : pid, 'name' : menu_elem}) values['parent_id'] = pid else: # The parent attribute was specified, if non-empty determine its ID, otherwise @@ -657,14 +657,14 @@ form: module.record_id""" % (xml_id,) groups_value.append((4, group_id)) values['groups_id'] = groups_value - pid = self.pool.get('ir.model.data')._update(cr, self.uid, 'ir.ui.menu', self.module, values, rec_id, noupdate=self.isnoupdate(data_node), mode=self.mode, res_id=res and res[0] or False) + pid = self.pool['ir.model.data']._update(cr, self.uid, 'ir.ui.menu', self.module, values, rec_id, noupdate=self.isnoupdate(data_node), mode=self.mode, res_id=res and res[0] or False) if rec_id and pid: self.idref[rec_id] = int(pid) if rec.get('action') and pid: action = "ir.actions.%s,%d" % (a_type, a_id) - self.pool.get('ir.model.data').ir_set(cr, self.uid, 'action', 'tree_but_open', 'Menuitem', [('ir.ui.menu', int(pid))], action, True, True, xml_id=rec_id) + self.pool['ir.model.data'].ir_set(cr, self.uid, 'action', 'tree_but_open', 'Menuitem', [('ir.ui.menu', int(pid))], action, True, True, xml_id=rec_id) return 'ir.ui.menu', pid def _assert_equals(self, f1, f2, prec=4): @@ -675,8 +675,7 @@ form: module.record_id""" % (xml_id,) return rec_model = rec.get("model",'').encode('ascii') - model = self.pool.get(rec_model) - assert model, "The model %s does not exist !" % (rec_model,) + model = self.pool[rec_model] rec_id = rec.get("id",'').encode('ascii') self._test_xml_id(rec_id) rec_src = rec.get("search",'').encode('utf8') @@ -692,7 +691,7 @@ form: module.record_id""" % (xml_id,) ids = [self.id_get(cr, rec_id)] elif rec_src: q = unsafe_eval(rec_src, eval_dict) - ids = self.pool.get(rec_model).search(cr, uid, q, context=context) + ids = self.pool[rec_model].search(cr, uid, q, context=context) if rec_src_count: count = int(rec_src_count) if len(ids) != count: @@ -737,8 +736,7 @@ form: module.record_id""" % (xml_id,) def _tag_record(self, cr, rec, data_node=None): rec_model = rec.get("model").encode('ascii') - model = self.pool.get(rec_model) - assert model, "The model %s does not exist !" % (rec_model,) + model = self.pool[rec_model] rec_id = rec.get("id",'').encode('ascii') rec_context = rec.get("context", None) if rec_context: @@ -752,7 +750,7 @@ form: module.record_id""" % (xml_id,) else: module = self.module rec_id2 = rec_id - id = self.pool.get('ir.model.data')._update_dummy(cr, self.uid, rec_model, module, rec_id2) + id = self.pool['ir.model.data']._update_dummy(cr, self.uid, rec_model, module, rec_id2) # check if the resource already existed at the last update if id: # if it existed, we don't update the data, but we need to @@ -785,11 +783,11 @@ form: module.record_id""" % (xml_id,) q = unsafe_eval(f_search, self.idref) field = [] assert f_model, 'Define an attribute model="..." in your .XML file !' - f_obj = self.pool.get(f_model) + f_obj = self.pool[f_model] # browse the objects searched s = f_obj.browse(cr, self.uid, f_obj.search(cr, self.uid, q)) # column definitions of the "local" object - _cols = self.pool.get(rec_model)._columns + _cols = self.pool[rec_model]._columns # if the current field is many2many if (f_name in _cols) and _cols[f_name]._type=='many2many': f_val = [(6, 0, map(lambda x: x[f_use], s))] @@ -815,7 +813,7 @@ form: module.record_id""" % (xml_id,) f_val = int(f_val) res[f_name] = f_val - id = self.pool.get('ir.model.data')._update(cr, self.uid, rec_model, self.module, res, rec_id or False, not self.isnoupdate(data_node), noupdate=self.isnoupdate(data_node), mode=self.mode, context=rec_context ) + id = self.pool['ir.model.data']._update(cr, self.uid, rec_model, self.module, res, rec_id or False, not self.isnoupdate(data_node), noupdate=self.isnoupdate(data_node), mode=self.mode, context=rec_context ) if rec_id: self.idref[rec_id] = int(id) if config.get('import_partial', False): @@ -830,7 +828,7 @@ form: module.record_id""" % (xml_id,) return res def model_id_get(self, cr, id_str): - model_data_obj = self.pool.get('ir.model.data') + model_data_obj = self.pool['ir.model.data'] mod = self.module if '.' in id_str: mod,id_str = id_str.split('.') @@ -857,7 +855,7 @@ form: module.record_id""" % (xml_id,) self.module = module self.cr = cr self.idref = idref - self.pool = pooler.get_pool(cr.dbname) + self.pool = openerp.registry(cr.dbname) self.uid = 1 if report is None: report = assertion_report.assertion_report() @@ -889,8 +887,6 @@ def convert_csv_import(cr, module, fname, csvcontent, idref=None, mode='init', #remove folder path from model head, model = os.path.split(model) - pool = pooler.get_pool(cr.dbname) - input = cStringIO.StringIO(csvcontent) #FIXME reader = csv.reader(input, quotechar='"', delimiter=',') fields = reader.next() @@ -921,7 +917,9 @@ def convert_csv_import(cr, module, fname, csvcontent, idref=None, mode='init', datas.append(map(lambda x: misc.ustr(x), line)) except: _logger.error("Cannot import the line: %s", line) - result, rows, warning_msg, dummy = pool.get(model).import_data(cr, uid, fields, datas,mode, module, noupdate, filename=fname_partial) + + registry = openerp.registry(cr.dbname) + result, rows, warning_msg, dummy = registry[model].import_data(cr, uid, fields, datas,mode, module, noupdate, filename=fname_partial) if result < 0: # Report failed import and abort module install raise Exception(_('Module loading failed: file %s/%s could not be processed:\n %s') % (module, fname, warning_msg)) diff --git a/openerp/tools/mail.py b/openerp/tools/mail.py index 574d8c94f05..1fe22094831 100644 --- a/openerp/tools/mail.py +++ b/openerp/tools/mail.py @@ -24,13 +24,13 @@ import cgi import logging import lxml.html import lxml.html.clean as clean -import openerp.pooler as pooler import random import re import socket import threading import time +import openerp from openerp.loglevels import ustr _logger = logging.getLogger(__name__) @@ -325,13 +325,13 @@ def email_send(email_from, email_to, subject, body, email_cc=None, email_bcc=Non if not cr: db_name = getattr(threading.currentThread(), 'dbname', None) if db_name: - local_cr = cr = pooler.get_db(db_name).cursor() + local_cr = cr = openerp.registry(db_name).db.cursor() else: raise Exception("No database cursor found, please pass one explicitly") # Send Email try: - mail_server_pool = pooler.get_pool(cr.dbname).get('ir.mail_server') + mail_server_pool = openerp.registry(cr.dbname)['ir.mail_server'] res = False # Pack Message into MIME Object email_msg = mail_server_pool.build_email(email_from, email_to, subject, body, email_cc, email_bcc, reply_to, diff --git a/openerp/tools/test_reports.py b/openerp/tools/test_reports.py index 9ec4dab6cc3..b6c866e7f4b 100644 --- a/openerp/tools/test_reports.py +++ b/openerp/tools/test_reports.py @@ -25,10 +25,10 @@ through the code of yaml tests. """ +import openerp import openerp.netsvc as netsvc import openerp.tools as tools import logging -import openerp.pooler as pooler from openerp.tools.safe_eval import safe_eval from subprocess import Popen, PIPE import os @@ -123,7 +123,7 @@ def try_report_action(cr, uid, action_id, active_model=None, active_ids=None, context = context.copy() # keep it local # TODO context fill-up - pool = pooler.get_pool(cr.dbname) + registry = openerp.registry(cr.dbname) def log_test(msg, *args): _logger.log(netsvc.logging.TEST, " - " + msg, *args) @@ -145,7 +145,7 @@ def try_report_action(cr, uid, action_id, active_model=None, active_ids=None, raise ValueError('You cannot only specify action_id "%s" without a module name' % action_id) act_module = our_module act_xmlid = action_id - act_model, act_id = pool.get('ir.model.data').get_object_reference(cr, uid, act_module, act_xmlid) + act_model, act_id = registry['ir.model.data'].get_object_reference(cr, uid, act_module, act_xmlid) else: assert isinstance(action_id, (long, int)) act_model = 'ir.action.act_window' # assume that @@ -181,11 +181,11 @@ def try_report_action(cr, uid, action_id, active_model=None, active_ids=None, log_test("will emulate a %s view: %s#%s", action['view_type'], datas['res_model'], view_id or '?') - view_res = pool.get(datas['res_model']).fields_view_get(cr, uid, view_id, action['view_type'], context) + view_res = registry[datas['res_model']].fields_view_get(cr, uid, view_id, action['view_type'], context) assert view_res and view_res.get('arch'), "Did not return any arch for the view" view_data = {} if view_res.get('fields',{}).keys(): - view_data = pool.get(datas['res_model']).default_get(cr, uid, view_res['fields'].keys(), context) + view_data = registry[datas['res_model']].default_get(cr, uid, view_res['fields'].keys(), context) if datas.get('form'): view_data.update(datas.get('form')) if wiz_data: @@ -238,7 +238,7 @@ def try_report_action(cr, uid, action_id, active_model=None, active_ids=None, if not datas['res_id']: # it is probably an orm_memory object, we need to create # an instance - datas['res_id'] = pool.get(datas['res_model']).create(cr, uid, view_data, context) + datas['res_id'] = registry[datas['res_model']].create(cr, uid, view_data, context) if not buttons: raise AssertionError("view form doesn't have any buttons to press!") @@ -255,7 +255,7 @@ def try_report_action(cr, uid, action_id, active_model=None, active_ids=None, continue if b['type'] == 'object': #there we are! press the button! - fn = getattr(pool.get(datas['res_model']), b['name']) + fn = getattr(registry[datas['res_model']], b['name']) if not fn: _logger.error("The %s model doesn't have a %s attribute!", datas['res_model'], b['name']) continue @@ -281,7 +281,7 @@ def try_report_action(cr, uid, action_id, active_model=None, active_ids=None, raise Exception("Cannot handle action of type %s" % act_model) log_test("will be using %s action %s #%d", act_model, act_xmlid, act_id) - action = pool.get(act_model).read(cr, uid, act_id, context=context) + action = registry[act_model].read(cr, uid, act_id, context=context) assert action, "Could not read action %s[%s]" %(act_model, act_id) loop = 0 while action: diff --git a/openerp/tools/translate.py b/openerp/tools/translate.py index 45688ae76e0..207d2f2992c 100644 --- a/openerp/tools/translate.py +++ b/openerp/tools/translate.py @@ -25,7 +25,6 @@ import fnmatch import inspect import locale import os -import openerp.pooler as pooler import openerp.sql_db as sql_db import re import logging @@ -43,6 +42,7 @@ import misc from misc import UpdateableStr from misc import SKIPPED_ELEMENT_TYPES import osutil +import openerp from openerp import SUPERUSER_ID _logger = logging.getLogger(__name__) @@ -208,7 +208,7 @@ class GettextAlias(object): (cr, dummy) = self._get_cr(frame, allow_create=False) uid = self._get_uid(frame) if pool and cr and uid: - lang = pool.get('res.users').context_get(cr, uid)['lang'] + lang = pool['res.users'].context_get(cr, uid)['lang'] return lang def __call__(self, source): @@ -227,8 +227,8 @@ class GettextAlias(object): cr, is_new_cr = self._get_cr(frame) if cr: # Try to use ir.translation to benefit from global cache if possible - pool = pooler.get_pool(cr.dbname) - res = pool.get('ir.translation')._get_source(cr, SUPERUSER_ID, None, ('code','sql_constraint'), lang, source) + registry = openerp.registry(cr.dbname) + res = registry['ir.translation']._get_source(cr, SUPERUSER_ID, None, ('code','sql_constraint'), lang, source) else: _logger.debug('no context cursor detected, skipping translation for "%r"', source) else: @@ -611,11 +611,11 @@ def babel_extract_qweb(fileobj, keywords, comment_tags, options): def trans_generate(lang, modules, cr): dbname = cr.dbname - pool = pooler.get_pool(dbname) - trans_obj = pool.get('ir.translation') - model_data_obj = pool.get('ir.model.data') + registry = openerp.registry(dbname) + trans_obj = registry.get('ir.translation') + model_data_obj = registry.get('ir.model.data') uid = 1 - l = pool.models.items() + l = registry.models.items() l.sort() query = 'SELECT name, model, res_id, module' \ @@ -659,15 +659,15 @@ def trans_generate(lang, modules, cr): model = encode(model) xml_name = "%s.%s" % (module, encode(xml_name)) - if not pool.get(model): + if not registry.get(model): _logger.error("Unable to find object %r", model) continue - exists = pool.get(model).exists(cr, uid, res_id) + exists = registry[model].exists(cr, uid, res_id) if not exists: _logger.warning("Unable to find object %r with id %d", model, res_id) continue - obj = pool.get(model).browse(cr, uid, res_id) + obj = registry[model].browse(cr, uid, res_id) if model=='ir.ui.view': d = etree.XML(encode(obj.arch)) @@ -682,7 +682,7 @@ def trans_generate(lang, modules, cr): except AttributeError, exc: _logger.error("name error in %s: %s", xml_name, str(exc)) continue - objmodel = pool.get(obj.model) + objmodel = registry[obj.model] if not objmodel or not field_name in objmodel._columns: continue field_def = objmodel._columns[field_name] @@ -764,7 +764,7 @@ def trans_generate(lang, modules, cr): push_constraint_msg(module, term_type, model._name, constraint[msg_pos]) for (_, model, module) in cr.fetchall(): - model_obj = pool.get(model) + model_obj = registry.get(model) if not model_obj: _logger.error("Unable to find object %r", model) @@ -794,7 +794,7 @@ def trans_generate(lang, modules, cr): return path.split(os.path.sep)[0] return 'base' # files that are not in a module are considered as being in 'base' module - modobj = pool.get('ir.module.module') + modobj = registry['ir.module.module'] installed_modids = modobj.search(cr, uid, [('state', '=', 'installed')]) installed_modules = map(lambda m: m['name'], modobj.read(cr, uid, installed_modids, ['name'])) @@ -887,9 +887,9 @@ def trans_load_data(cr, fileobj, fileformat, lang, lang_name=None, verbose=True, if context is None: context = {} db_name = cr.dbname - pool = pooler.get_pool(db_name) - lang_obj = pool.get('res.lang') - trans_obj = pool.get('ir.translation') + registry = openerp.registry(db_name) + lang_obj = registry.get('res.lang') + trans_obj = registry.get('ir.translation') iso_lang = misc.get_iso_codes(lang) try: ids = lang_obj.search(cr, SUPERUSER_ID, [('code','=', lang)]) @@ -1009,11 +1009,10 @@ def load_language(cr, lang): :param lang: language ISO code with optional _underscore_ and l10n flavor (ex: 'fr', 'fr_BE', but not 'fr-BE') :type lang: str """ - pool = pooler.get_pool(cr.dbname) - language_installer = pool.get('base.language.install') - uid = 1 - oid = language_installer.create(cr, uid, {'lang': lang}) - language_installer.lang_install(cr, uid, [oid], context=None) + registry = openerp.registry(cr.dbname) + language_installer = registry['base.language.install'] + oid = language_installer.create(cr, SUPERUSER_ID, {'lang': lang}) + language_installer.lang_install(cr, SUPERUSER_ID, [oid], context=None) # vim:expandtab:smartindent:tabstop=4:softtabstop=4:shiftwidth=4: diff --git a/openerp/tools/yaml_import.py b/openerp/tools/yaml_import.py index 3172caac1f4..a4be9ad3edc 100644 --- a/openerp/tools/yaml_import.py +++ b/openerp/tools/yaml_import.py @@ -5,7 +5,7 @@ import time # used to eval time.strftime expressions from datetime import datetime, timedelta import logging -import openerp.pooler as pooler +import openerp import openerp.sql_db as sql_db import misc from config import config @@ -112,7 +112,7 @@ class YamlInterpreter(object): self.assertion_report = report self.noupdate = noupdate self.loglevel = loglevel - self.pool = pooler.get_pool(cr.dbname) + self.pool = openerp.registry(cr.dbname) self.uid = 1 self.context = {} # opererp context self.eval_context = {'ref': self._ref(), @@ -128,9 +128,7 @@ class YamlInterpreter(object): return lambda xml_id: self.get_id(xml_id) def get_model(self, model_name): - model = self.pool.get(model_name) - assert model, "The model %s does not exist." % (model_name,) - return model + return self.pool[model_name] def validate_xml_id(self, xml_id): id = xml_id @@ -140,7 +138,7 @@ class YamlInterpreter(object): "It is used to refer to other modules ID, in the form: module.record_id" \ % (xml_id,) if module != self.module: - module_count = self.pool.get('ir.module.module').search_count(self.cr, self.uid, \ + module_count = self.pool['ir.module.module'].search_count(self.cr, self.uid, \ ['&', ('name', '=', module), ('state', 'in', ['installed'])]) assert module_count == 1, 'The ID "%s" refers to an uninstalled module.' % (xml_id,) if len(id) > 64: # TODO where does 64 come from (DB is 128)? should be a constant or loaded form DB @@ -162,7 +160,7 @@ class YamlInterpreter(object): module = self.module checked_xml_id = xml_id try: - _, id = self.pool.get('ir.model.data').get_object_reference(self.cr, self.uid, module, checked_xml_id) + _, id = self.pool['ir.model.data'].get_object_reference(self.cr, self.uid, module, checked_xml_id) self.id_map[xml_id] = id except ValueError: raise ValueError("""%s not found when processing %s. @@ -201,7 +199,7 @@ class YamlInterpreter(object): ids = [self.get_id(assertion.id)] elif assertion.search: q = eval(assertion.search, self.eval_context) - ids = self.pool.get(assertion.model).search(self.cr, self.uid, q, context=assertion.context) + ids = self.pool[assertion.model].search(self.cr, self.uid, q, context=assertion.context) else: raise YamlImportException('Nothing to assert: you must give either an id or a search criteria.') return ids @@ -290,20 +288,20 @@ class YamlInterpreter(object): module = self.module if '.' in view_id: module, view_id = view_id.split('.',1) - view_id = self.pool.get('ir.model.data').get_object_reference(self.cr, SUPERUSER_ID, module, view_id)[1] + view_id = self.pool['ir.model.data'].get_object_reference(self.cr, SUPERUSER_ID, module, view_id)[1] if model.is_transient(): record_dict=self.create_osv_memory_record(record, fields) else: self.validate_xml_id(record.id) try: - self.pool.get('ir.model.data')._get_id(self.cr, SUPERUSER_ID, self.module, record.id) + self.pool['ir.model.data']._get_id(self.cr, SUPERUSER_ID, self.module, record.id) default = False except ValueError: default = True if self.isnoupdate(record) and self.mode != 'init': - id = self.pool.get('ir.model.data')._update_dummy(self.cr, SUPERUSER_ID, record.model, self.module, record.id) + id = self.pool['ir.model.data']._update_dummy(self.cr, SUPERUSER_ID, record.model, self.module, record.id) # check if the resource already existed at the last update if id: self.id_map[record] = int(id) @@ -324,7 +322,7 @@ class YamlInterpreter(object): record_dict = self._create_record(model, fields, view_info, default=default) _logger.debug("RECORD_DICT %s" % record_dict) - id = self.pool.get('ir.model.data')._update(self.cr, SUPERUSER_ID, record.model, \ + id = self.pool['ir.model.data']._update(self.cr, SUPERUSER_ID, record.model, \ self.module, record_dict, record.id, noupdate=self.isnoupdate(record), mode=self.mode, context=context) self.id_map[record.id] = int(id) if config.get('import_partial'): @@ -346,7 +344,7 @@ class YamlInterpreter(object): one2many_view = fg[field_name]['views'].get(view_type) # if the view is not defined inline, we call fields_view_get() if not one2many_view: - one2many_view = self.pool.get(fg[field_name]['relation']).fields_view_get(self.cr, SUPERUSER_ID, False, view_type, self.context) + one2many_view = self.pool[fg[field_name]['relation']].fields_view_get(self.cr, SUPERUSER_ID, False, view_type, self.context) return one2many_view def process_val(key, val): @@ -707,7 +705,7 @@ class YamlInterpreter(object): self._set_group_values(node, values) - pid = self.pool.get('ir.model.data')._update(self.cr, SUPERUSER_ID, \ + pid = self.pool['ir.model.data']._update(self.cr, SUPERUSER_ID, \ 'ir.ui.menu', self.module, values, node.id, mode=self.mode, \ noupdate=self.isnoupdate(node), res_id=res and res[0] or False) @@ -718,7 +716,7 @@ class YamlInterpreter(object): action_type = node.type or 'act_window' action_id = self.get_id(node.action) action = "ir.actions.%s,%d" % (action_type, action_id) - self.pool.get('ir.model.data').ir_set(self.cr, SUPERUSER_ID, 'action', \ + self.pool['ir.model.data'].ir_set(self.cr, SUPERUSER_ID, 'action', \ 'tree_but_open', 'Menuitem', [('ir.ui.menu', int(parent_id))], action, True, True, xml_id=node.id) def process_act_window(self, node): @@ -752,7 +750,7 @@ class YamlInterpreter(object): if node.target: values['target'] = node.target - id = self.pool.get('ir.model.data')._update(self.cr, SUPERUSER_ID, \ + id = self.pool['ir.model.data']._update(self.cr, SUPERUSER_ID, \ 'ir.actions.act_window', self.module, values, node.id, mode=self.mode) self.id_map[node.id] = int(id) @@ -760,7 +758,7 @@ class YamlInterpreter(object): keyword = 'client_action_relate' value = 'ir.actions.act_window,%s' % id replace = node.replace or True - self.pool.get('ir.model.data').ir_set(self.cr, SUPERUSER_ID, 'action', keyword, \ + self.pool['ir.model.data'].ir_set(self.cr, SUPERUSER_ID, 'action', keyword, \ node.id, [node.src_model], value, replace=replace, noupdate=self.isnoupdate(node), isobject=True, xml_id=node.id) # TODO add remove ir.model.data @@ -768,11 +766,11 @@ class YamlInterpreter(object): assert getattr(node, 'model'), "Attribute %s of delete tag is empty !" % ('model',) if self.pool.get(node.model): if node.search: - ids = self.pool.get(node.model).search(self.cr, self.uid, eval(node.search, self.eval_context)) + ids = self.pool[node.model].search(self.cr, self.uid, eval(node.search, self.eval_context)) else: ids = [self.get_id(node.id)] if len(ids): - self.pool.get(node.model).unlink(self.cr, self.uid, ids) + self.pool[node.model].unlink(self.cr, self.uid, ids) else: self._log("Record not deleted.") @@ -781,7 +779,7 @@ class YamlInterpreter(object): res = {'name': node.name, 'url': node.url, 'target': node.target} - id = self.pool.get('ir.model.data')._update(self.cr, SUPERUSER_ID, \ + id = self.pool['ir.model.data']._update(self.cr, SUPERUSER_ID, \ "ir.actions.act_url", self.module, res, node.id, mode=self.mode) self.id_map[node.id] = int(id) # ir_set @@ -789,7 +787,7 @@ class YamlInterpreter(object): keyword = node.keyword or 'client_action_multi' value = 'ir.actions.act_url,%s' % id replace = node.replace or True - self.pool.get('ir.model.data').ir_set(self.cr, SUPERUSER_ID, 'action', \ + self.pool['ir.model.data'].ir_set(self.cr, SUPERUSER_ID, 'action', \ keyword, node.url, ["ir.actions.act_url"], value, replace=replace, \ noupdate=self.isnoupdate(node), isobject=True, xml_id=node.id) @@ -804,7 +802,7 @@ class YamlInterpreter(object): else: value = expression res[fieldname] = value - self.pool.get('ir.model.data').ir_set(self.cr, SUPERUSER_ID, res['key'], res['key2'], \ + self.pool['ir.model.data'].ir_set(self.cr, SUPERUSER_ID, res['key'], res['key2'], \ res['name'], res['models'], res['value'], replace=res.get('replace',True), \ isobject=res.get('isobject', False), meta=res.get('meta',None)) @@ -833,7 +831,7 @@ class YamlInterpreter(object): self._set_group_values(node, values) - id = self.pool.get('ir.model.data')._update(self.cr, SUPERUSER_ID, "ir.actions.report.xml", \ + id = self.pool['ir.model.data']._update(self.cr, SUPERUSER_ID, "ir.actions.report.xml", \ self.module, values, xml_id, noupdate=self.isnoupdate(node), mode=self.mode) self.id_map[xml_id] = int(id) @@ -841,7 +839,7 @@ class YamlInterpreter(object): keyword = node.keyword or 'client_print_multi' value = 'ir.actions.report.xml,%s' % id replace = node.replace or True - self.pool.get('ir.model.data').ir_set(self.cr, SUPERUSER_ID, 'action', \ + self.pool['ir.model.data'].ir_set(self.cr, SUPERUSER_ID, 'action', \ keyword, values['name'], [values['model']], value, replace=replace, isobject=True, xml_id=xml_id) def process_none(self): diff --git a/openerp/workflow/wkf_expr.py b/openerp/workflow/wkf_expr.py index 8e93a99f038..b43fa83e3de 100644 --- a/openerp/workflow/wkf_expr.py +++ b/openerp/workflow/wkf_expr.py @@ -19,7 +19,7 @@ # ############################################################################## -import openerp.pooler as pooler +import openerp from openerp.tools.safe_eval import safe_eval as eval class Env(dict): @@ -28,7 +28,7 @@ class Env(dict): self.uid = uid self.model = model self.ids = ids - self.obj = pooler.get_pool(cr.dbname).get(model) + self.obj = openerp.registry(cr.dbname)[model] self.columns = self.obj._columns.keys() + self.obj._inherit_fields.keys() def __getitem__(self, key): @@ -58,7 +58,7 @@ def _eval_expr(cr, ident, workitem, action): return ret def execute_action(cr, ident, workitem, activity): - obj = pooler.get_pool(cr.dbname).get('ir.actions.server') + obj = openerp.registry(cr.dbname)['ir.actions.server'] ctx = {'active_model':ident[1], 'active_id':ident[2], 'active_ids':[ident[2]]} result = obj.run(cr, ident[0], [activity['action_id']], ctx) return result @@ -72,8 +72,8 @@ def check(cr, workitem, ident, transition, signal): uid = ident[0] if transition['group_id'] and uid != 1: - pool = pooler.get_pool(cr.dbname) - user_groups = pool.get('res.users').read(cr, uid, [uid], ['groups_id'])[0]['groups_id'] + registry = openerp.registry(cr.dbname) + user_groups = registry['res.users'].read(cr, uid, [uid], ['groups_id'])[0]['groups_id'] if not transition['group_id'] in user_groups: return False From 314a8dab70097847a10eb884f558f0f05b672698 Mon Sep 17 00:00:00 2001 From: Vo Minh Thu Date: Wed, 27 Mar 2013 15:16:53 +0100 Subject: [PATCH 27/34] [REF] pooler: mark the functions as deprecated. bzr revid: vmt@openerp.com-20130327141653-p7re4tknkwe1pc80 --- openerp/conf/deprecation.py | 5 +++++ openerp/pooler.py | 9 +++++++++ 2 files changed, 14 insertions(+) diff --git a/openerp/conf/deprecation.py b/openerp/conf/deprecation.py index 11399bef4fb..caca00f5f26 100644 --- a/openerp/conf/deprecation.py +++ b/openerp/conf/deprecation.py @@ -35,4 +35,9 @@ by the user to check if her code is future proof. # Change to False around 2013.02. open_openerp_namespace = False +# If True, the functions in openerp.pooler can be used. +# Introduced around 2013.03 (actually they are deprecated since much longer +# but no warning was dispayed in the logs). +openerp_pooler = True + # vim:expandtab:smartindent:tabstop=4:softtabstop=4:shiftwidth=4: diff --git a/openerp/pooler.py b/openerp/pooler.py index 58cf4936b27..0df6f88c819 100644 --- a/openerp/pooler.py +++ b/openerp/pooler.py @@ -25,27 +25,36 @@ """ +import logging +import openerp.conf.deprecation from openerp.modules.registry import RegistryManager +_logger = logging.getLogger(__name__) def get_db_and_pool(db_name, force_demo=False, status=None, update_module=False): """Create and return a database connection and a newly initialized registry.""" + assert openerp.conf.deprecation.openerp_pooler + _logger.warning('openerp.pooler.get_db_and_pool() is deprecated.') registry = RegistryManager.get(db_name, force_demo, status, update_module) return registry.db, registry def restart_pool(db_name, force_demo=False, status=None, update_module=False): """Delete an existing registry and return a database connection and a newly initialized registry.""" + _logger.warning('openerp.pooler.restart_pool() is deprecated.') + assert openerp.conf.deprecation.openerp_pooler registry = RegistryManager.new(db_name, force_demo, status, update_module) return registry.db, registry def get_db(db_name): """Return a database connection. The corresponding registry is initialized.""" + assert openerp.conf.deprecation.openerp_pooler return get_db_and_pool(db_name)[0] def get_pool(db_name, force_demo=False, status=None, update_module=False): """Return a model registry.""" + assert openerp.conf.deprecation.openerp_pooler return get_db_and_pool(db_name, force_demo, status, update_module)[1] # vim:expandtab:smartindent:tabstop=4:softtabstop=4:shiftwidth=4: From 5134bf4b941f6ebea9f2d849808ab890e54f41e2 Mon Sep 17 00:00:00 2001 From: Vo Minh Thu Date: Wed, 27 Mar 2013 16:23:22 +0100 Subject: [PATCH 28/34] [REF] registry: the new_registry() helper is not useful enough, we do not need it at the top-level. bzr revid: vmt@openerp.com-20130327152322-1bsslx8jicjh26eq --- openerp/__init__.py | 7 ------- openerp/addons/base/ir/ir_model.py | 3 +-- 2 files changed, 1 insertion(+), 9 deletions(-) diff --git a/openerp/__init__.py b/openerp/__init__.py index b7c09488996..960890de0b6 100644 --- a/openerp/__init__.py +++ b/openerp/__init__.py @@ -60,12 +60,5 @@ def registry(database_name): """ return modules.registry.RegistryManager.get(database_name) -def new_registry(database_name): - """ - Return the model registry for the given database. If the registry already - existed, it is deleted and created again. - """ - return modules.registry.RegistryManager.new(database_name) - # vim:expandtab:smartindent:tabstop=4:softtabstop=4:shiftwidth=4: diff --git a/openerp/addons/base/ir/ir_model.py b/openerp/addons/base/ir/ir_model.py index a2664e62485..7de01aa3d11 100644 --- a/openerp/addons/base/ir/ir_model.py +++ b/openerp/addons/base/ir/ir_model.py @@ -168,7 +168,7 @@ class ir_model(osv.osv): if not context.get(MODULE_UNINSTALL_FLAG): # only reload pool for normal unlink. For module uninstall the # reload is done independently in openerp.modules.loading - openerp.new_registry(cr.dbname) + openerp.modules.registry.RegistryManager.new(cr.dbname) return res @@ -194,7 +194,6 @@ class ir_model(osv.osv): field_state='manual', select=vals.get('select_level', '0')) self.pool[vals['model']]._auto_init(cr, ctx) - # openerp.new_registry(cr.dbname) return res def instanciate(self, cr, user, model, context=None): From 7b8f4fe5ee6369bb95ca7143b21a7c5b15e70c85 Mon Sep 17 00:00:00 2001 From: Vo Minh Thu Date: Wed, 27 Mar 2013 16:38:43 +0100 Subject: [PATCH 29/34] [REF] tests: use the openerp.tests namespace for test-related logging. bzr revid: vmt@openerp.com-20130327153843-u62ftp74qv01u1ww --- openerp/addons/base/ir/ir_mail_server.py | 4 +++- openerp/modules/loading.py | 5 +++-- openerp/modules/module.py | 5 +++-- openerp/tools/test_reports.py | 8 +++++--- 4 files changed, 14 insertions(+), 8 deletions(-) diff --git a/openerp/addons/base/ir/ir_mail_server.py b/openerp/addons/base/ir/ir_mail_server.py index 24feefb18ad..10fc5f82187 100644 --- a/openerp/addons/base/ir/ir_mail_server.py +++ b/openerp/addons/base/ir/ir_mail_server.py @@ -41,6 +41,8 @@ import openerp.tools as tools from openerp.loglevels import ustr _logger = logging.getLogger(__name__) +_test_logger = logging.getLogger('openerp.tests') + class MailDeliveryException(osv.except_osv): """Specific exception subclass for mail delivery errors""" @@ -411,7 +413,7 @@ class ir_mail_server(osv.osv): # Do not actually send emails in testing mode! if getattr(threading.currentThread(), 'testing', False): - _logger.info("skip sending email in test mode") + _test_logger.info("skip sending email in test mode") return message['Message-Id'] # Get SMTP Server Details from Mail Server diff --git a/openerp/modules/loading.py b/openerp/modules/loading.py index 350452e16c4..9b735f8255c 100644 --- a/openerp/modules/loading.py +++ b/openerp/modules/loading.py @@ -44,6 +44,7 @@ from openerp.modules.module import initialize_sys_path, \ load_openerp_module, init_module_models, adapt_version _logger = logging.getLogger(__name__) +_test_logger = logging.getLogger('openerp.tests') def load_module_graph(cr, graph, status=None, perform_checks=True, skip_modules=None, report=None): @@ -75,7 +76,7 @@ def load_module_graph(cr, graph, status=None, perform_checks=True, skip_modules= _load_data(cr, module_name, idref, mode, 'test') return True except Exception: - _logger.exception( + _test_logger.exception( 'module %s: an exception occurred in a test', module_name) return False finally: @@ -96,7 +97,7 @@ def load_module_graph(cr, graph, status=None, perform_checks=True, skip_modules= """ for filename in package.data[kind]: if kind == 'test': - _logger.info("module %s: loading test %s", module_name, filename) + _test_logger.info("module %s: loading %s", module_name, filename) else: _logger.info("module %s: loading %s", module_name, filename) _, ext = os.path.splitext(filename) diff --git a/openerp/modules/module.py b/openerp/modules/module.py index 9fdca4a9766..cc7b5904c73 100644 --- a/openerp/modules/module.py +++ b/openerp/modules/module.py @@ -43,6 +43,7 @@ from cStringIO import StringIO import logging _logger = logging.getLogger(__name__) +_test_logger = logging.getLogger('openerp.tests') _ad = os.path.join(os.path.dirname(os.path.dirname(__file__)), 'addons') # default addons path (base) ad_paths = [] @@ -503,7 +504,7 @@ def run_unit_tests(module_name): for m in ms: suite.addTests(unittest2.TestLoader().loadTestsFromModule(m)) if ms: - _logger.info('module %s: executing %s `fast_suite` and/or `checks` sub-modules', module_name, len(ms)) + _test_logger.info('module %s: executing %s `fast_suite` and/or `checks` sub-modules', module_name, len(ms)) # Use a custom stream object to log the test executions. class MyStream(object): def __init__(self): @@ -518,7 +519,7 @@ def run_unit_tests(module_name): if not first: c = '` ' + c first = False - _logger.info(c) + _test_logger.info(c) result = unittest2.TextTestRunner(verbosity=2, stream=MyStream()).run(suite) if result.wasSuccessful(): return True diff --git a/openerp/tools/test_reports.py b/openerp/tools/test_reports.py index 14deffb9ec2..e4c4e1cc5ac 100644 --- a/openerp/tools/test_reports.py +++ b/openerp/tools/test_reports.py @@ -35,6 +35,8 @@ import os import tempfile _logger = logging.getLogger(__name__) +_test_logger = logging.getLogger('openerp.tests') + def try_report(cr, uid, rname, ids, data=None, context=None, our_module=None): """ Try to render a report with contents of ids @@ -49,7 +51,7 @@ def try_report(cr, uid, rname, ids, data=None, context=None, our_module=None): rname_s = rname[7:] else: rname_s = rname - _logger.info(" - Trying %s.create(%r)", rname, ids) + _test_logger.info(" - Trying %s.create(%r)", rname, ids) res = netsvc.LocalService(rname).create(cr, uid, ids, data, context) if not isinstance(res, tuple): raise RuntimeError("Result of %s.create() should be a (data,format) tuple, now it is a %s" % \ @@ -92,7 +94,7 @@ def try_report(cr, uid, rname, ids, data=None, context=None, our_module=None): _logger.warning("Report %s produced a \"%s\" chunk, cannot examine it", rname, res_format) return False - _logger.info(" + Report %s produced correctly.", rname) + _test_logger.info(" + Report %s produced correctly.", rname) return True def try_report_action(cr, uid, action_id, active_model=None, active_ids=None, @@ -126,7 +128,7 @@ def try_report_action(cr, uid, action_id, active_model=None, active_ids=None, pool = pooler.get_pool(cr.dbname) def log_test(msg, *args): - _logger.info(" - " + msg, *args) + _test_logger.info(" - " + msg, *args) datas = {} if active_model: From ce58e16138ab29d02ae972171b779c4fca5c82fd Mon Sep 17 00:00:00 2001 From: Vo Minh Thu Date: Wed, 27 Mar 2013 16:44:25 +0100 Subject: [PATCH 30/34] [REF] yaml_import: removed nested import openerp. bzr revid: vmt@openerp.com-20130327154425-uu1fa01tdhrjt8kn --- openerp/tools/yaml_import.py | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/openerp/tools/yaml_import.py b/openerp/tools/yaml_import.py index 2ce7fc0a99a..662229541ad 100644 --- a/openerp/tools/yaml_import.py +++ b/openerp/tools/yaml_import.py @@ -5,6 +5,7 @@ import time # used to eval time.strftime expressions from datetime import datetime, timedelta import logging +import openerp import openerp.pooler as pooler import openerp.sql_db as sql_db import misc @@ -281,7 +282,6 @@ class YamlInterpreter(object): return record_dict def process_record(self, node): - import openerp.osv as osv record, fields = node.items()[0] model = self.get_model(record.model) @@ -540,7 +540,6 @@ class YamlInterpreter(object): self.noupdate = node.noupdate def process_python(self, node): - import openerp python, statements = node.items()[0] model = self.get_model(python.model) statements = statements.replace("\r\n", "\n") From de5c84c0e1a4d3a0ed2165e05b09c5354090ffdb Mon Sep 17 00:00:00 2001 From: Vo Minh Thu Date: Wed, 27 Mar 2013 16:47:14 +0100 Subject: [PATCH 31/34] [REF] removed nested import openerp. bzr revid: vmt@openerp.com-20130327154714-fa3k6gqtsmlt3vx6 --- openerp/addons/base/ir/ir_actions.py | 5 ++--- openerp/report/__init__.py | 4 ++-- openerp/report/interface.py | 2 +- 3 files changed, 5 insertions(+), 6 deletions(-) diff --git a/openerp/addons/base/ir/ir_actions.py b/openerp/addons/base/ir/ir_actions.py index 1d717048b3f..cbdddb4401c 100644 --- a/openerp/addons/base/ir/ir_actions.py +++ b/openerp/addons/base/ir/ir_actions.py @@ -20,11 +20,13 @@ ############################################################################## import logging +import operator import os import re from socket import gethostname import time +import openerp from openerp import SUPERUSER_ID from openerp import netsvc, tools from openerp.osv import fields, osv @@ -89,9 +91,6 @@ class report_xml(osv.osv): """ Look up a report definition. """ - import openerp - import operator - import os opj = os.path.join # First lookup in the deprecated place, because if the report definition diff --git a/openerp/report/__init__.py b/openerp/report/__init__.py index 647e6ba93a6..2cf01636806 100644 --- a/openerp/report/__init__.py +++ b/openerp/report/__init__.py @@ -19,6 +19,8 @@ # ############################################################################## +import openerp + import interface import print_xml import print_fnc @@ -30,12 +32,10 @@ import report_sxw import printscreen - def render_report(cr, uid, ids, name, data, context=None): """ Helper to call ``ir.actions.report.xml.render_report()``. """ - import openerp registry = openerp.modules.registry.RegistryManager.get(cr.dbname) return registry['ir.actions.report.xml'].render_report(cr, uid, ids, name, data, context) diff --git a/openerp/report/interface.py b/openerp/report/interface.py index 2f3a89a913b..39de2fc7a31 100644 --- a/openerp/report/interface.py +++ b/openerp/report/interface.py @@ -25,6 +25,7 @@ import re from lxml import etree import openerp.pooler as pooler +import openerp import openerp.tools as tools import openerp.modules import print_xml @@ -45,7 +46,6 @@ class report_int(object): def __init__(self, name, register=True): if register: - import openerp assert openerp.conf.deprecation.allow_report_int_registration assert name.startswith('report.'), 'Report names should start with "report.".' assert name not in self._reports, 'The report "%s" already exists.' % name From 92aace0c1340bdacd669c691bdba0dd50af0d46e Mon Sep 17 00:00:00 2001 From: Vo Minh Thu Date: Wed, 27 Mar 2013 16:53:53 +0100 Subject: [PATCH 32/34] [DOC] netsvc: typo in docstring. bzr revid: vmt@openerp.com-20130327155353-5eo7r95e7gbw9c4l --- openerp/netsvc.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/openerp/netsvc.py b/openerp/netsvc.py index 799fd74158b..52984ccf29f 100644 --- a/openerp/netsvc.py +++ b/openerp/netsvc.py @@ -45,7 +45,7 @@ _logger = logging.getLogger(__name__) def LocalService(name): """ - The openerp.netsvc.LocalService() fucntion is deprecated. It still works + The openerp.netsvc.LocalService() function is deprecated. It still works in two cases: workflows and reports. For workflows, instead of using LocalService('workflow'), openerp.workflow should be used (better yet, methods on openerp.osv.orm.Model should be used). For reports, From 4613a97c0101cc906b4c75d10015d88bac7c72c5 Mon Sep 17 00:00:00 2001 From: Vo Minh Thu Date: Wed, 27 Mar 2013 16:59:17 +0100 Subject: [PATCH 33/34] [REF] trolls.convert: missed an opportunity to reuse a beautiful association list. bzr revid: vmt@openerp.com-20130327155917-xaepclhoazgw51ef --- openerp/tools/convert.py | 7 ++----- 1 file changed, 2 insertions(+), 5 deletions(-) diff --git a/openerp/tools/convert.py b/openerp/tools/convert.py index cf8633f7a82..aaa29f2f9d3 100644 --- a/openerp/tools/convert.py +++ b/openerp/tools/convert.py @@ -294,7 +294,8 @@ form: module.record_id""" % (xml_id,) res[dest] = rec.get(f,'').encode('utf8') assert res[dest], "Attribute %s of report is empty !" % (f,) for field,dest in (('rml','report_rml'),('file','report_rml'),('xml','report_xml'),('xsl','report_xsl'), - ('attachment','attachment'),('attachment_use','attachment_use'), ('usage','usage')): + ('attachment','attachment'),('attachment_use','attachment_use'), ('usage','usage'), + ('report_type', 'report_type'), ('parser', 'parser')): if rec.get(field): res[dest] = rec.get(field).encode('utf8') if rec.get('auto'): @@ -304,10 +305,6 @@ form: module.record_id""" % (xml_id,) res['report_sxw_content'] = sxw_content if rec.get('header'): res['header'] = eval(rec.get('header','False')) - if rec.get('report_type'): - res['report_type'] = rec.get('report_type') - if rec.get('parser'): - res['parser'] = rec.get('parser') res['multi'] = rec.get('multi') and eval(rec.get('multi','False')) From 255cec154a8e65c1005bce7d113398d009d1d6f7 Mon Sep 17 00:00:00 2001 From: Vo Minh Thu Date: Wed, 27 Mar 2013 17:04:20 +0100 Subject: [PATCH 34/34] [IMP] report: let the exceptions bubble up when using eval(). bzr revid: vmt@openerp.com-20130327160420-pxw83283xcro1h52 --- openerp/report/render/rml2pdf/utils.py | 13 +++++-------- 1 file changed, 5 insertions(+), 8 deletions(-) diff --git a/openerp/report/render/rml2pdf/utils.py b/openerp/report/render/rml2pdf/utils.py index 273d5815609..75923e64081 100644 --- a/openerp/report/render/rml2pdf/utils.py +++ b/openerp/report/render/rml2pdf/utils.py @@ -131,14 +131,11 @@ def _process_text(self, txt): to_translate = tools.ustr(sps.pop(0)) result += tools.ustr(self.localcontext.get('translate', lambda x:x)(to_translate)) if sps: - try: - txt = None - expr = sps.pop(0) - txt = eval(expr, self.localcontext) - if txt and isinstance(txt, basestring): - txt = tools.ustr(txt) - except Exception: - pass + txt = None + expr = sps.pop(0) + txt = eval(expr, self.localcontext) + if txt and isinstance(txt, basestring): + txt = tools.ustr(txt) if isinstance(txt, basestring): result += txt elif txt and (txt is not None) and (txt is not False):