[FIX] expression: internal domain operators require different parsing

Ensure the absence of internal domain operators is correctly
propagated throughout the domain parsing.
This commit is contained in:
Olivier Dony 2015-06-23 15:02:23 +02:00
parent 816be76ee6
commit 6acd5ef91c
1 changed files with 7 additions and 7 deletions

View File

@ -490,7 +490,7 @@ class ExtendedLeaf(object):
# i.e.: many2one: 'state_id': current field name
# --------------------------------------------------
def __init__(self, leaf, model, join_context=None):
def __init__(self, leaf, model, join_context=None, internal=False):
""" Initialize the ExtendedLeaf
:attr [string, tuple] leaf: operator or tuple-formatted domain
@ -529,7 +529,7 @@ class ExtendedLeaf(object):
self._models.append(item[0])
self._models.append(model)
# check validity
self.check_leaf()
self.check_leaf(internal)
def __str__(self):
return '<osv.ExtendedLeaf: %s on %s (ctx: %s)>' % (str(self.leaf), self.model._table, ','.join(self._get_context_debug()))
@ -575,7 +575,7 @@ class ExtendedLeaf(object):
# Leaf manipulation
# --------------------------------------------------
def check_leaf(self):
def check_leaf(self, internal=False):
""" Leaf validity rules:
- a valid leaf is an operator or a leaf
- a valid leaf has a field objects unless
@ -584,7 +584,7 @@ class ExtendedLeaf(object):
- left is id, operator is 'child_of'
- left is in MAGIC_COLUMNS
"""
if not is_operator(self.leaf) and not is_leaf(self.leaf, True):
if not is_operator(self.leaf) and not is_leaf(self.leaf, internal):
raise ValueError("Invalid leaf %s" % str(self.leaf))
def is_operator(self):
@ -603,14 +603,14 @@ class ExtendedLeaf(object):
self.leaf = normalize_leaf(self.leaf)
return True
def create_substitution_leaf(leaf, new_elements, new_model=None):
def create_substitution_leaf(leaf, new_elements, new_model=None, internal=False):
""" From a leaf, create a new leaf (based on the new_elements tuple
and new_model), that will have the same join context. Used to
insert equivalent leafs in the processing stack. """
if new_model is None:
new_model = leaf.model
new_join_context = [tuple(context) for context in leaf.join_context]
new_leaf = ExtendedLeaf(new_elements, new_model, join_context=new_join_context)
new_leaf = ExtendedLeaf(new_elements, new_model, join_context=new_join_context, internal=internal)
return new_leaf
class expression(object):
@ -1062,7 +1062,7 @@ class expression(object):
'model',
right,
)
push(create_substitution_leaf(leaf, ('id', inselect_operator, (subselect, params)), working_model))
push(create_substitution_leaf(leaf, ('id', inselect_operator, (subselect, params)), working_model, internal=True))
else:
push_result(leaf)