Improve code flow for Django 1.7/1.8 in patch_lookup args

fix_request_path_info
Diederik van der Boor 2016-03-11 17:16:05 +01:00
parent 88922d7d5e
commit 5aa15b226e
1 changed files with 39 additions and 41 deletions

View File

@ -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):