Doesn't allow anymore strings as domain on fields

It is strings inside the domain list that will be evaluated
This commit is contained in:
Cédric Krier committed 2009-06-23 18:48:48 +02:00
1 parent dcbf771336
commit 39457b4bf3
4 files changed
+24 -4

No files matched your search

+1 -1
View File
@@ -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')
+1 -1
View File
@@ -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([
('=', '='),
+1
View File
@@ -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
+21 -2
View File
@@ -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',):