From 5d31a6937c0e2103746a71ced85cfcea0689e924 Mon Sep 17 00:00:00 2001 From: Vishmita Date: Fri, 18 Jan 2013 12:56:42 +0530 Subject: [PATCH 1/6] [Fix]Rename based on receptions invoicing control method to Based on incoming shipments in purchase settings bzr revid: vja@tinyerp.com-20130118072642-1d1et63jh1bhe6pw --- addons/purchase/res_config.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/addons/purchase/res_config.py b/addons/purchase/res_config.py index bfe2cdf6bca..130247037a4 100644 --- a/addons/purchase/res_config.py +++ b/addons/purchase/res_config.py @@ -30,7 +30,7 @@ class purchase_config_settings(osv.osv_memory): _columns = { 'default_invoice_method': fields.selection( [('manual', 'Based on purchase order lines'), - ('picking', 'Based on receptions'), + ('picking', 'Based on incoming shipments'), ('order', 'Pre-generate draft invoices based on purchase orders'), ], 'Default invoicing control method', required=True, default_model='purchase.order'), 'group_purchase_pricelist':fields.boolean("Manage pricelist per supplier", From df7c209164f60325dc8611f255a61211866b3935 Mon Sep 17 00:00:00 2001 From: Vo Minh Thu Date: Tue, 19 Feb 2013 17:30:47 +0100 Subject: [PATCH 2/6] [FIX] Better exception handling in tools.convert: - The exception is not logged in tools.convert. It is loggeg by the netsv layer anyway. - The exception is re-raised instead, but with the full traceback available. - A fix in openerp.service.db where the cr is closed twice. bzr revid: vmt@openerp.com-20130219163047-3q766awd66wkzsn7 --- openerp/service/db.py | 47 ++++++++++++++++++++++------------------ openerp/tools/convert.py | 23 ++++++++++---------- 2 files changed, 38 insertions(+), 32 deletions(-) diff --git a/openerp/service/db.py b/openerp/service/db.py index 7272b82bc83..413ac3127b4 100644 --- a/openerp/service/db.py +++ b/openerp/service/db.py @@ -20,39 +20,44 @@ self_id_protect = threading.Semaphore() # This should be moved to openerp.modules.db, along side initialize(). def _initialize_db(id, db_name, demo, lang, user_password): - cr = None 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.tools.config['lang'] = lang - cr.commit() - cr.close() + cr = None + 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.tools.config['lang'] = lang + cr.commit() + finally: + if cr: + cr.close() + cr = None pool = openerp.pooler.restart_pool(db_name, demo, self_actions[id], update_module=True)[1] - cr = openerp.sql_db.db_connect(db_name).cursor() + try: + cr = openerp.sql_db.db_connect(db_name).cursor() - if lang: - modobj = pool.get('ir.module.module') - mids = modobj.search(cr, SUPERUSER_ID, [('state', '=', 'installed')]) - modobj.update_translations(cr, SUPERUSER_ID, mids, lang) + if lang: + modobj = pool.get('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) + # update admin's password and lang + values = {'password': user_password, 'lang': lang} + pool.get('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) - cr.commit() - cr.close() + cr.execute('SELECT login, password FROM res_users ORDER BY login') + self_actions[id].update(users=cr.dictfetchall(), clean=True) + cr.commit() + finally: + if cr: + cr.close() except Exception, e: self_actions[id].update(clean=False, exception=e) _logger.exception('CREATE DATABASE failed:') self_actions[id]['traceback'] = traceback.format_exc() - if cr: - cr.close() def dispatch(method, params): if method in [ 'create', 'get_progress', 'drop', 'dump', diff --git a/openerp/tools/convert.py b/openerp/tools/convert.py index 00b8bf96340..a06a308bd7e 100644 --- a/openerp/tools/convert.py +++ b/openerp/tools/convert.py @@ -25,6 +25,7 @@ import logging import os.path import pickle import re +import sys # for eval context: import time @@ -61,13 +62,16 @@ from misc import unquote unsafe_eval = eval from safe_eval import safe_eval as eval -class ConvertError(Exception): - def __init__(self, doc, orig_excpt): - self.d = doc - self.orig = orig_excpt +class ParseError(Exception): + def __init__(self, msg, text, filename, lineno): + self.msg = msg + self.text = text + self.filename = filename + self.lineno = lineno def __str__(self): - return 'Exception:\n\t%s\nUsing file:\n%s' % (self.orig, self.d) + return '"%s" while parsing %s:%s, near\n%s' \ + % (self.msg, self.filename, self.lineno, self.text) def _ref(self, cr): return lambda x: self.id_get(cr, x) @@ -841,13 +845,10 @@ form: module.record_id""" % (xml_id,) if rec.tag in self._tags: try: self._tags[rec.tag](self.cr, rec, n) - except: - _logger.error('Parse error in %s:%d: \n%s', - rec.getroottree().docinfo.URL, - rec.sourceline, - etree.tostring(rec).strip(), exc_info=True) + except Exception, e: self.cr.rollback() - raise + exc_info = sys.exc_info() + raise ParseError, (str(e), etree.tostring(rec).rstrip(), rec.getroottree().docinfo.URL, rec.sourceline), exc_info[2] return True def __init__(self, cr, module, idref, mode, report=None, noupdate=False): From 0de24bf983bbed6bcf544571bbdfef6d6ff802b0 Mon Sep 17 00:00:00 2001 From: Vo Minh Thu Date: Wed, 20 Feb 2013 11:22:59 +0100 Subject: [PATCH 3/6] [IMP] safe_eval: do not log exceptions, when re-raising a new exception, make the stacktrace complete. bzr revid: vmt@openerp.com-20130220102259-avee8fx2a1kpdog3 --- openerp/tools/safe_eval.py | 15 ++++++--------- 1 file changed, 6 insertions(+), 9 deletions(-) diff --git a/openerp/tools/safe_eval.py b/openerp/tools/safe_eval.py index b99de385af3..c56c94efdfd 100644 --- a/openerp/tools/safe_eval.py +++ b/openerp/tools/safe_eval.py @@ -106,11 +106,11 @@ def test_expr(expr, allowed_codes, mode="eval"): expr = expr.strip() code_obj = compile(expr, "", mode) except (SyntaxError, TypeError): - _logger.debug('Invalid eval expression', exc_info=True) raise - except Exception: - _logger.debug('Disallowed or invalid eval expression', exc_info=True) - raise ValueError("%s is not a valid expression" % expr) + except Exception, e: + import sys + exc_info = sys.exc_info() + raise ValueError, '"%s" while compiling\n%s' % (str(e), expr), exc_info[2] for code in _get_opcodes(code_obj): if code not in allowed_codes: raise ValueError("opcode %s not allowed (%r)" % (opname[code], expr)) @@ -237,10 +237,7 @@ def safe_eval(expr, globals_dict=None, locals_dict=None, mode="eval", nocopy=Fal 'set' : set } ) - try: - return eval(test_expr(expr, _SAFE_OPCODES, mode=mode), globals_dict, locals_dict) - except Exception: - _logger.exception('Cannot eval %r', expr) - raise + c = test_expr(expr, _SAFE_OPCODES, mode=mode) + return eval(c, globals_dict, locals_dict) # vim:expandtab:smartindent:tabstop=4:softtabstop=4:shiftwidth=4: From c62780673cc927c438a5f310a7b9fe295f00bbee Mon Sep 17 00:00:00 2001 From: Vo Minh Thu Date: Mon, 25 Feb 2013 17:35:25 +0100 Subject: [PATCH 4/6] [FIX] tools.safe_eval: we want to see the expr which fail to eval(), so report it in the exception. bzr revid: vmt@openerp.com-20130225163525-3g9qw1g3hkyyxf1j --- openerp/tools/safe_eval.py | 11 +++++++++-- 1 file changed, 9 insertions(+), 2 deletions(-) diff --git a/openerp/tools/safe_eval.py b/openerp/tools/safe_eval.py index c56c94efdfd..67caf3a2a10 100644 --- a/openerp/tools/safe_eval.py +++ b/openerp/tools/safe_eval.py @@ -35,6 +35,8 @@ from opcode import HAVE_ARGUMENT, opmap, opname from types import CodeType import logging +from .misc import ustr + __all__ = ['test_expr', 'safe_eval', 'const_eval'] # The time module is usually already provided in the safe_eval environment @@ -110,7 +112,7 @@ def test_expr(expr, allowed_codes, mode="eval"): except Exception, e: import sys exc_info = sys.exc_info() - raise ValueError, '"%s" while compiling\n%s' % (str(e), expr), exc_info[2] + raise ValueError, '"%s" while compiling\n%r' % (ustr(e), expr), exc_info[2] for code in _get_opcodes(code_obj): if code not in allowed_codes: raise ValueError("opcode %s not allowed (%r)" % (opname[code], expr)) @@ -238,6 +240,11 @@ def safe_eval(expr, globals_dict=None, locals_dict=None, mode="eval", nocopy=Fal } ) c = test_expr(expr, _SAFE_OPCODES, mode=mode) - return eval(c, globals_dict, locals_dict) + try: + return eval(c, globals_dict, locals_dict) + except Exception, e: + import sys + exc_info = sys.exc_info() + raise ValueError, '"%s" while evaluating\n%r' % (ustr(e), expr), exc_info[2] # vim:expandtab:smartindent:tabstop=4:softtabstop=4:shiftwidth=4: From b71457e2584a80769287b82a4976a27aa178b3f7 Mon Sep 17 00:00:00 2001 From: Vo Minh Thu Date: Mon, 25 Feb 2013 17:40:28 +0100 Subject: [PATCH 5/6] [FIX] tools.convert: use tools.ustr() instead of str() on exceptions. bzr revid: vmt@openerp.com-20130225164028-d48k5yheuoph1vm3 --- openerp/tools/convert.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/openerp/tools/convert.py b/openerp/tools/convert.py index a06a308bd7e..59e66512da4 100644 --- a/openerp/tools/convert.py +++ b/openerp/tools/convert.py @@ -848,7 +848,7 @@ form: module.record_id""" % (xml_id,) except Exception, e: self.cr.rollback() exc_info = sys.exc_info() - raise ParseError, (str(e), etree.tostring(rec).rstrip(), rec.getroottree().docinfo.URL, rec.sourceline), exc_info[2] + raise ParseError, (misc.ustr(e), etree.tostring(rec).rstrip(), rec.getroottree().docinfo.URL, rec.sourceline), exc_info[2] return True def __init__(self, cr, module, idref, mode, report=None, noupdate=False): From d43dba744c9f74c397d1614ee254af4369f855e2 Mon Sep 17 00:00:00 2001 From: Vo Minh Thu Date: Tue, 26 Feb 2013 10:44:46 +0100 Subject: [PATCH 6/6] safe_eval: re-raise the same exception type when completing it. bzr revid: vmt@openerp.com-20130226094446-7c2dw5c5eou0lg8r --- openerp/tools/safe_eval.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/openerp/tools/safe_eval.py b/openerp/tools/safe_eval.py index 67caf3a2a10..49244d92e81 100644 --- a/openerp/tools/safe_eval.py +++ b/openerp/tools/safe_eval.py @@ -245,6 +245,6 @@ def safe_eval(expr, globals_dict=None, locals_dict=None, mode="eval", nocopy=Fal except Exception, e: import sys exc_info = sys.exc_info() - raise ValueError, '"%s" while evaluating\n%r' % (ustr(e), expr), exc_info[2] + raise exc_info[0], '"%s" while evaluating\n%r' % (ustr(e), expr), exc_info[2] # vim:expandtab:smartindent:tabstop=4:softtabstop=4:shiftwidth=4: