[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:
parent
816be76ee6
commit
6acd5ef91c
|
@ -490,7 +490,7 @@ class ExtendedLeaf(object):
|
||||||
# i.e.: many2one: 'state_id': current field name
|
# 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
|
""" Initialize the ExtendedLeaf
|
||||||
|
|
||||||
:attr [string, tuple] leaf: operator or tuple-formatted domain
|
:attr [string, tuple] leaf: operator or tuple-formatted domain
|
||||||
|
@ -529,7 +529,7 @@ class ExtendedLeaf(object):
|
||||||
self._models.append(item[0])
|
self._models.append(item[0])
|
||||||
self._models.append(model)
|
self._models.append(model)
|
||||||
# check validity
|
# check validity
|
||||||
self.check_leaf()
|
self.check_leaf(internal)
|
||||||
|
|
||||||
def __str__(self):
|
def __str__(self):
|
||||||
return '<osv.ExtendedLeaf: %s on %s (ctx: %s)>' % (str(self.leaf), self.model._table, ','.join(self._get_context_debug()))
|
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
|
# Leaf manipulation
|
||||||
# --------------------------------------------------
|
# --------------------------------------------------
|
||||||
|
|
||||||
def check_leaf(self):
|
def check_leaf(self, internal=False):
|
||||||
""" Leaf validity rules:
|
""" Leaf validity rules:
|
||||||
- a valid leaf is an operator or a leaf
|
- a valid leaf is an operator or a leaf
|
||||||
- a valid leaf has a field objects unless
|
- a valid leaf has a field objects unless
|
||||||
|
@ -584,7 +584,7 @@ class ExtendedLeaf(object):
|
||||||
- left is id, operator is 'child_of'
|
- left is id, operator is 'child_of'
|
||||||
- left is in MAGIC_COLUMNS
|
- 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))
|
raise ValueError("Invalid leaf %s" % str(self.leaf))
|
||||||
|
|
||||||
def is_operator(self):
|
def is_operator(self):
|
||||||
|
@ -603,14 +603,14 @@ class ExtendedLeaf(object):
|
||||||
self.leaf = normalize_leaf(self.leaf)
|
self.leaf = normalize_leaf(self.leaf)
|
||||||
return True
|
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
|
""" 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
|
and new_model), that will have the same join context. Used to
|
||||||
insert equivalent leafs in the processing stack. """
|
insert equivalent leafs in the processing stack. """
|
||||||
if new_model is None:
|
if new_model is None:
|
||||||
new_model = leaf.model
|
new_model = leaf.model
|
||||||
new_join_context = [tuple(context) for context in leaf.join_context]
|
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
|
return new_leaf
|
||||||
|
|
||||||
class expression(object):
|
class expression(object):
|
||||||
|
@ -1062,7 +1062,7 @@ class expression(object):
|
||||||
'model',
|
'model',
|
||||||
right,
|
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:
|
else:
|
||||||
push_result(leaf)
|
push_result(leaf)
|
||||||
|
|
Loading…
Reference in New Issue