Improve code flow for Django 1.7/1.8 in patch_lookup args
parent
88922d7d5e
commit
5aa15b226e
|
|
@ -182,12 +182,16 @@ class PolymorphicQuerySet(QuerySet):
|
||||||
def _process_aggregate_args(self, args, kwargs):
|
def _process_aggregate_args(self, args, kwargs):
|
||||||
"""for aggregate and annotate kwargs: allow ModelX___field syntax for kwargs, forbid it for args.
|
"""for aggregate and annotate kwargs: allow ModelX___field syntax for kwargs, forbid it for args.
|
||||||
Modifies kwargs if needed (these are Aggregate objects, we translate the lookup member variable)"""
|
Modifies kwargs if needed (these are Aggregate objects, we translate the lookup member variable)"""
|
||||||
|
___lookup_assert_msg = 'PolymorphicModel: annotate()/aggregate(): ___ model lookup supported for keyword arguments only'
|
||||||
|
|
||||||
def patch_lookup_lt_18(a):
|
if django.VERSION < (1, 8):
|
||||||
|
def patch_lookup(a):
|
||||||
a.lookup = translate_polymorphic_field_path(self.model, a.lookup)
|
a.lookup = translate_polymorphic_field_path(self.model, a.lookup)
|
||||||
|
|
||||||
|
def test___lookup(a):
|
||||||
def patch_lookup_gte_18(a):
|
assert '___' not in a.lookup, ___lookup_assert_msg
|
||||||
|
else:
|
||||||
|
def patch_lookup(a):
|
||||||
# With Django > 1.8, the field on which the aggregate operates is
|
# With Django > 1.8, the field on which the aggregate operates is
|
||||||
# stored inside a complex query expression.
|
# stored inside a complex query expression.
|
||||||
if isinstance(a, Q):
|
if isinstance(a, Q):
|
||||||
|
|
@ -195,15 +199,11 @@ class PolymorphicQuerySet(QuerySet):
|
||||||
elif hasattr(a, 'get_source_expressions'):
|
elif hasattr(a, 'get_source_expressions'):
|
||||||
for source_expression in a.get_source_expressions():
|
for source_expression in a.get_source_expressions():
|
||||||
if source_expression is not None:
|
if source_expression is not None:
|
||||||
patch_lookup_gte_18(source_expression)
|
patch_lookup(source_expression)
|
||||||
else:
|
else:
|
||||||
a.name = translate_polymorphic_field_path(self.model, a.name)
|
a.name = translate_polymorphic_field_path(self.model, a.name)
|
||||||
|
|
||||||
___lookup_assert_msg = 'PolymorphicModel: annotate()/aggregate(): ___ model lookup supported for keyword arguments only'
|
def test___lookup(a):
|
||||||
def test___lookup_for_args_lt_18(a):
|
|
||||||
assert '___' not in a.lookup, ___lookup_assert_msg
|
|
||||||
|
|
||||||
def test___lookup_for_args_gte_18(a):
|
|
||||||
""" *args might be complex expressions too in django 1.8 so
|
""" *args might be complex expressions too in django 1.8 so
|
||||||
the testing for a '___' is rather complex on this one """
|
the testing for a '___' is rather complex on this one """
|
||||||
if isinstance(a, Q):
|
if isinstance(a, Q):
|
||||||
|
|
@ -222,15 +222,13 @@ class PolymorphicQuerySet(QuerySet):
|
||||||
tree_node_test___lookup(self.model, a)
|
tree_node_test___lookup(self.model, a)
|
||||||
elif hasattr(a, 'get_source_expressions'):
|
elif hasattr(a, 'get_source_expressions'):
|
||||||
for source_expression in a.get_source_expressions():
|
for source_expression in a.get_source_expressions():
|
||||||
test___lookup_for_args_gte_18(source_expression)
|
test___lookup(source_expression)
|
||||||
else:
|
else:
|
||||||
assert '___' not in a.name, ___lookup_assert_msg
|
assert '___' not in a.name, ___lookup_assert_msg
|
||||||
|
|
||||||
for a in args:
|
for a in args:
|
||||||
test___lookup = test___lookup_for_args_lt_18 if django.VERSION < (1, 8) else test___lookup_for_args_gte_18
|
|
||||||
test___lookup(a)
|
test___lookup(a)
|
||||||
for a in six.itervalues(kwargs):
|
for a in six.itervalues(kwargs):
|
||||||
patch_lookup = patch_lookup_lt_18 if django.VERSION < (1, 8) else patch_lookup_gte_18
|
|
||||||
patch_lookup(a)
|
patch_lookup(a)
|
||||||
|
|
||||||
def annotate(self, *args, **kwargs):
|
def annotate(self, *args, **kwargs):
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue