From 588fbd837fba09b2b61155ec89aa2d17e9a913b1 Mon Sep 17 00:00:00 2001 From: ced <> Date: Thu, 7 Jun 2007 10:35:05 +0000 Subject: [PATCH] KERNEL,BASE: fix _where_calc and domain get for rule bzr revid: ced-7a8713933b54f837db2312e605a7afad7dbf91c5 --- bin/addons/base/ir/ir_rule.py | 23 +++++++++++++++-------- bin/osv/orm.py | 5 +++-- 2 files changed, 18 insertions(+), 10 deletions(-) diff --git a/bin/addons/base/ir/ir_rule.py b/bin/addons/base/ir/ir_rule.py index 59d586e8600..56fa2fb0b85 100644 --- a/bin/addons/base/ir/ir_rule.py +++ b/bin/addons/base/ir/ir_rule.py @@ -110,23 +110,30 @@ class ir_rule(osv.osv): dom = eval("[('%s', '%s', %s)]"%(rule.field_id.name, rule.operator, rule.operand), {'user': self.pool.get('res.users').browse(cr, 1, uid), 'time':time}) clause.setdefault(rule.rule_group.id, []) clause[rule.rule_group.id].append(obj._where_calc(cr, uid, dom)) - str = '' + query = '' val = [] for g in clause.values(): if not g: continue - if len(str): - str += ' AND ' - str += '(' + if len(query): + query += ' AND ' + query += '(' first = True for c in g: if not first: - str += ' OR ' + query += ' OR ' first = False - str += '('+c[0][0]+')' + query += '(' + first2 = True + for clause in c[0]: + if not first2: + query += ' AND ' + first2 = False + query += clause + query += ')' val += c[1] - str += ')' - return str, val + query += ')' + return query, val domain_get = tools.cache()(domain_get) def write(self, cr, uid, *args, **argv): diff --git a/bin/osv/orm.py b/bin/osv/orm.py index 7d02ca0a9fa..ee580cbc088 100644 --- a/bin/osv/orm.py +++ b/bin/osv/orm.py @@ -1338,7 +1338,7 @@ class orm(object): return result # TODO: ameliorer avec NULL - def _where_calc(self, cr, user, args): + def _where_calc(self, cr, user, args, context={}): # if the object has a field named 'active', filter out all inactive # records unless they were explicitely asked for if 'active' in self._columns: @@ -1381,6 +1381,7 @@ class orm(object): i+=1 elif field._type=='many2many': + #XXX Fixme if args[i][1]=='child_of': if isinstance(args[i][2], basestring): ids2 = [x[0] for x in self.pool.get(field._obj).name_search(cr, user, args[i][2], [], 'like')] @@ -1516,7 +1517,7 @@ class orm(object): def search(self, cr, user, args, offset=0, limit=None, order=None, context={}): # compute the where, order by, limit and offset clauses - (qu1,qu2,tables) = self._where_calc(cr, user, args) + (qu1,qu2,tables) = self._where_calc(cr, user, args, context) if len(qu1): qu1 = ' where '+string.join(qu1,' and ')