From 39457b4bf3c3e780a483bb915f95ebb31b6111f2 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?C=C3=A9dric=20Krier?= Date: Tue, 23 Jun 2009 18:48:48 +0200 Subject: [PATCH] Doesn't allow anymore strings as domain on fields It is strings inside the domain list that will be evaluated --- trytond/ir/default.py | 2 +- trytond/ir/rule.py | 2 +- trytond/model/fields/field.py | 1 + trytond/model/modelstorage.py | 23 +++++++++++++++++++++-- 4 files changed, 24 insertions(+), 4 deletions(-) diff --git a/trytond/ir/default.py b/trytond/ir/default.py index e0be4a892b..42a1099a20 100644 --- a/trytond/ir/default.py +++ b/trytond/ir/default.py @@ -16,7 +16,7 @@ class Default(ModelSQL, ModelView): model = fields.Many2One('ir.model', 'Model', required=True, ondelete='CASCADE') field = fields.Many2One('ir.model.field', 'Field', required=True, - ondelete='CASCADE', domain="[('model', '=', model)]") + ondelete='CASCADE', domain=["('model', '=', model)"]) value = fields.Text('Value') clause = fields.Text('Clause') user = fields.Many2One('res.user', 'User', ondelete='CASCADE') diff --git a/trytond/ir/rule.py b/trytond/ir/rule.py index 4d43850df9..1a0ca84c52 100644 --- a/trytond/ir/rule.py +++ b/trytond/ir/rule.py @@ -86,7 +86,7 @@ class Rule(ModelSQL, ModelView): _rec_name = 'field' _description = __doc__ field = fields.Many2One('ir.model.field', 'Field', - domain="[('model', '=', _parent_rule_group.model)]", select=1, + domain=["('model', '=', _parent_rule_group.model)"], select=1, required=True) operator = fields.Selection([ ('=', '='), diff --git a/trytond/model/fields/field.py b/trytond/model/fields/field.py index 2b2800532d..ba24db9543 100644 --- a/trytond/model/fields/field.py +++ b/trytond/model/fields/field.py @@ -46,6 +46,7 @@ class Field(object): self.required = required self.readonly = readonly self.domain = domain or [] + assert isinstance(self.domain, list), 'domain must be a list' self.states = states or {} self.priority = priority self.change_default = change_default diff --git a/trytond/model/modelstorage.py b/trytond/model/modelstorage.py index 0b9e243e1e..f4e1c28a31 100644 --- a/trytond/model/modelstorage.py +++ b/trytond/model/modelstorage.py @@ -818,6 +818,25 @@ class ModelStorage(Model): ctx_pref = user_obj.get_preferences(cursor, user, context_only=True, context=context) + def eval_domain(domain, env=None): + res = [] + for arg in domain: + if isinstance(arg, basestring): + if arg in ('AND', 'OR'): + res.append(arg) + else: + if not env: + return True + res.append(eval(arg, env)) + elif isinstance(arg, tuple): + res.append(arg) + elif isinstance(arg, list): + arg = eval_domain(arg, env=env) + if arg == True: + return True + res.append(arg) + return res + context.update(ctx_pref) records = self.browse(cursor, user, ids, context=context) for field_name, field in self._columns.iteritems(): @@ -828,7 +847,7 @@ class ModelStorage(Model): relation_obj = self.pool.get(field.model_name) else: relation_obj = field.get_target(self.pool) - if isinstance(field.domain, basestring): + if eval_domain(field.domain) == True: ctx = context.copy() ctx.update(ctx_pref) for record in records: @@ -838,7 +857,7 @@ class ModelStorage(Model): env['time'] = time env['context'] = context env['active_id'] = record.id - domain = eval(field.domain, env) + domain = eval_domain(field.domain, env=env) relation_ids = [] if record[field_name]: if field._type in ('many2one',):