From 5472c050aff29d0cb40d80c4e5166b2dc3cea1f0 Mon Sep 17 00:00:00 2001 From: Xavier Morel Date: Tue, 9 Nov 2010 12:52:54 +0100 Subject: [PATCH 1/4] [FIX] base: don't return search_view and search_view_id from ir_values.get bzr revid: xmo@openerp.com-20101109115254-svfwdr3kfb7as7a6 --- bin/addons/base/ir/ir_values.py | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/bin/addons/base/ir/ir_values.py b/bin/addons/base/ir/ir_values.py index 310f3552403..e4e60bc4731 100644 --- a/bin/addons/base/ir/ir_values.py +++ b/bin/addons/base/ir/ir_values.py @@ -196,10 +196,12 @@ class ir_values(osv.osv): id = int(id) fields = self.pool.get(model).fields_get_keys(cr, uid) pos = 0 + # FIXME: It might be a good idea to opt-in that kind of stuff + # FIXME: instead of arbitrarily removing random fields while pos Date: Tue, 9 Nov 2010 12:57:41 +0100 Subject: [PATCH 2/4] [IMP] make type tests more readable in ir_values.get bzr revid: xmo@openerp.com-20101109115741-15iyg5tpblgmb2yy --- bin/addons/base/ir/ir_values.py | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/bin/addons/base/ir/ir_values.py b/bin/addons/base/ir/ir_values.py index e4e60bc4731..77c6a572337 100644 --- a/bin/addons/base/ir/ir_values.py +++ b/bin/addons/base/ir/ir_values.py @@ -149,8 +149,8 @@ class ir_values(osv.osv): def get(self, cr, uid, key, key2, models, meta=False, context={}, res_id_req=False, without_user=True, key2_req=True): result = [] for m in models: - if type(m)==type([]) or type(m)==type(()): - m,res_id = m + if isinstance(m, (list, tuple)): + m, res_id = m else: res_id=False @@ -223,7 +223,7 @@ class ir_values(osv.osv): res = filter(bool, map(lambda x: _result_get(x, keys), list(result))) res2 = res[:] for r in res: - if type(r[2])==type({}) and 'type' in r[2]: + if isinstance(r[2], dict) and 'type' in r[2]: if r[2]['type'] in ('ir.actions.report.xml','ir.actions.act_window','ir.actions.wizard'): groups = r[2].get('groups_id') if groups: From b89aef19f15cff658ef3f6db04be8cb2669569d2 Mon Sep 17 00:00:00 2001 From: Xavier Morel Date: Tue, 9 Nov 2010 14:08:34 +0100 Subject: [PATCH 3/4] [IMP] base: tentative code simplifications (removal of redundant calls) in ir_values.get bzr revid: xmo@openerp.com-20101109130834-2rdsy3u7hm8kzj5n --- bin/addons/base/ir/ir_values.py | 44 +++++++++++++-------------------- 1 file changed, 17 insertions(+), 27 deletions(-) diff --git a/bin/addons/base/ir/ir_values.py b/bin/addons/base/ir/ir_values.py index 77c6a572337..abc6aa5d928 100644 --- a/bin/addons/base/ir/ir_values.py +++ b/bin/addons/base/ir/ir_values.py @@ -159,9 +159,8 @@ class ir_values(osv.osv): if key2: where.append('key2=%s') params.append(key2[:200]) - else: - if key2_req and not meta: - where.append('key2 is null') + elif key2_req and not meta: + where.append('key2 is null') if res_id_req and (models[-1][0]==m): if res_id: where.append('res_id=%s') @@ -193,7 +192,6 @@ class ir_values(osv.osv): keys.append(x[1]) if x[3]: model,id = x[2].split(',') - id = int(id) fields = self.pool.get(model).fields_get_keys(cr, uid) pos = 0 # FIXME: It might be a good idea to opt-in that kind of stuff @@ -206,37 +204,29 @@ class ir_values(osv.osv): else: pos+=1 try: - datas = self.pool.get(model).read(cr, uid, [id], fields, context) + datas = self.pool.get(model).read(cr, uid, [int(id)], fields, context) except except_orm, e: return False - datas= datas and datas[0] or None + datas = datas and datas[0] if not datas: - #ir_del(cr, uid, x[0]) return False else: - datas = pickle.loads(str(x[2].encode('utf-8'))) + datas = pickle.loads(x[2].encode('utf-8')) if meta: - meta2 = pickle.loads(x[4]) - return (x[0],x[1],datas,meta2) - return (x[0],x[1],datas) + return (x[0], x[1], datas, pickle.loads(x[4])) + return (x[0], x[1], datas) keys = [] - res = filter(bool, map(lambda x: _result_get(x, keys), list(result))) + res = filter(None, map(lambda x: _result_get(x, keys), result)) res2 = res[:] for r in res: - if isinstance(r[2], dict) and 'type' in r[2]: - if r[2]['type'] in ('ir.actions.report.xml','ir.actions.act_window','ir.actions.wizard'): - groups = r[2].get('groups_id') - if groups: - cr.execute('SELECT COUNT(1) FROM res_groups_users_rel WHERE gid IN %s AND uid=%s',(tuple(groups), uid)) - cnt = cr.fetchone()[0] - if not cnt: - res2.remove(r) - if r[1] == 'Menuitem' and not res2: - raise osv.except_osv('Error !','You do not have the permission to perform this operation !!!') + if isinstance(r[2], dict) and r[2].get('type') in ('ir.actions.report.xml','ir.actions.act_window','ir.actions.wizard'): + groups = r[2].get('groups_id') + if groups: + cr.execute('SELECT COUNT(1) FROM res_groups_users_rel WHERE gid IN %s AND uid=%s',(tuple(groups), uid)) + cnt = cr.fetchone()[0] + if not cnt: + res2.remove(r) + if r[1] == 'Menuitem' and not res2: + raise osv.except_osv('Error !','You do not have the permission to perform this operation !!!') return res2 ir_values() - - - -# vim:expandtab:smartindent:tabstop=4:softtabstop=4:shiftwidth=4: - From f3722bbfe410fd113daaa45d419435764be4b28c Mon Sep 17 00:00:00 2001 From: Xavier Morel Date: Tue, 9 Nov 2010 14:08:47 +0100 Subject: [PATCH 4/4] [IMP] base: make ir_values.get._result_get more readable and slightly faster. On a test set of ~20 fields, using a precomputed set instead of a spot-computed tuple for 'in' testing yields ~30% speed improvement, and replacing the manual removal of elements by a listcomp filtering yields ~30% more. Tests were also performed using sets and set.difference, while it yields better performances than manual element removal it is still worse than listcomp, especially when taking in account the re-serialization to a list bzr revid: xmo@openerp.com-20101109130847-p1xfmk3zhhivebj1 --- bin/addons/base/ir/ir_values.py | 19 ++++++++++--------- 1 file changed, 10 insertions(+), 9 deletions(-) diff --git a/bin/addons/base/ir/ir_values.py b/bin/addons/base/ir/ir_values.py index abc6aa5d928..f600f53ec79 100644 --- a/bin/addons/base/ir/ir_values.py +++ b/bin/addons/base/ir/ir_values.py @@ -24,6 +24,11 @@ from osv.orm import except_orm import pickle from tools.translate import _ +EXCLUDED_FIELDS = set(( + 'report_sxw_content', 'report_rml_content', 'report_sxw', 'report_rml', + 'report_sxw_content_data', 'report_rml_content_data', 'search_view', + 'search_view_id')) + class ir_values(osv.osv): _name = 'ir.values' @@ -192,17 +197,13 @@ class ir_values(osv.osv): keys.append(x[1]) if x[3]: model,id = x[2].split(',') - fields = self.pool.get(model).fields_get_keys(cr, uid) - pos = 0 # FIXME: It might be a good idea to opt-in that kind of stuff # FIXME: instead of arbitrarily removing random fields - while pos