From 1c7f70e24582dbe093d899b2d7f2816ed43b352d Mon Sep 17 00:00:00 2001 From: Vo Minh Thu Date: Mon, 28 Feb 2011 12:44:20 +0100 Subject: [PATCH] [FIX] correct two problems with domains: - an empty domain is treated as equivalent to [] - AND and OR symbols are introduced more carefully lp bug: https://launchpad.net/bugs/719406 fixed bzr revid: vmt@openerp.com-20110228114420-pdk1x41b55flx2y7 --- bin/addons/base/ir/ir_rule.py | 35 +++++++++++++++++++++++++---------- 1 file changed, 25 insertions(+), 10 deletions(-) diff --git a/bin/addons/base/ir/ir_rule.py b/bin/addons/base/ir/ir_rule.py index 2fc4c145002..9826a5bcea1 100644 --- a/bin/addons/base/ir/ir_rule.py +++ b/bin/addons/base/ir/ir_rule.py @@ -34,9 +34,12 @@ class ir_rule(osv.osv): def _domain_force_get(self, cr, uid, ids, field_name, arg, context={}): res = {} for rule in self.browse(cr, uid, ids, context): - eval_user_data = {'user': self.pool.get('res.users').browse(cr, 1, uid), - 'time':time} - res[rule.id] = eval(rule.domain_force, eval_user_data) + if rule.domain_force: + eval_user_data = {'user': self.pool.get('res.users').browse(cr, 1, uid), + 'time':time} + res[rule.id] = eval(rule.domain_force, eval_user_data) + else: + res[rule.id] = [] return res def _get_value(self, cr, uid, ids, field_name, arg, context={}): @@ -81,10 +84,15 @@ class ir_rule(osv.osv): ] def domain_create(self, cr, uid, rule_ids): - dom = ['&'] * (len(rule_ids)-1) + count = 0 + dom = [] for rule in self.browse(cr, uid, rule_ids): - dom += rule.domain - return dom + if rule.domain: + dom += rule.domain + count += 1 + if count: + return ['&'] * (count-1) + dom + return [] @tools.cache() def _compute_domain(self, cr, uid, model_name, mode="read"): @@ -110,11 +118,18 @@ class ir_rule(osv.osv): group_rule.setdefault(group.id, []).append(rule.id) if not rule.groups: global_rules.append(rule.id) - dom = self.domain_create(cr, uid, global_rules) - dom += ['|'] * (len(group_rule)-1) + global_domain = self.domain_create(cr, uid, global_rules) + count = 0 + group_domains = [] for value in group_rule.values(): - dom += self.domain_create(cr, uid, value) - return dom + group_domain = self.domain_create(cr, uid, value) + if group_domain: + group_domains += group_domain + count += 1 + if count and global_domain: + return ['&'] + global_domain + ['|'] * (count-1) + group_domains + if count: + return ['|'] * (count-1) + group_domains return [] def clear_cache(self, cr, uid):