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:
1 parent
dcbf771336
commit
39457b4bf3
4 files changed
+24
-4
No files matched your search
@@ -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
@@ -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([
|
||||
('=', '='),
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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',):
|
||||
|
||||
Reference in new issue
Block a user