From 0232befbae68e0e9cb7840411d321e800b2b5347 Mon Sep 17 00:00:00 2001 From: Adam Donaghy Date: Wed, 19 Aug 2020 14:00:53 +1000 Subject: [PATCH 1/5] Attempted fix for failures on master --- polymorphic/query.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/polymorphic/query.py b/polymorphic/query.py index a86b2dc..c2cc78f 100644 --- a/polymorphic/query.py +++ b/polymorphic/query.py @@ -157,7 +157,7 @@ class PolymorphicQuerySet(QuerySet): # Implementation in _translate_polymorphic_filter_defnition.""" return self.filter(not_instance_of=args) - def _filter_or_exclude(self, negate, *args, **kwargs): + def _filter_or_exclude(self, negate, args, kwargs): # We override this internal Django functon as it is used for all filter member functions. q_objects = translate_polymorphic_filter_definitions_in_args( self.model, args, using=self.db @@ -167,7 +167,7 @@ class PolymorphicQuerySet(QuerySet): self.model, kwargs, using=self.db ) return super(PolymorphicQuerySet, self)._filter_or_exclude( - negate, *(list(q_objects) + additional_args), **kwargs + negate, (list(q_objects) + additional_args), kwargs ) def order_by(self, *field_names): From 21f635d65abd3ddff8edd9077f82d0f56f431da8 Mon Sep 17 00:00:00 2001 From: Adam Donaghy Date: Wed, 19 Aug 2020 17:36:39 +1000 Subject: [PATCH 2/5] Backwards compatible _filter_or_exclude --- AUTHORS.rst | 1 + polymorphic/query.py | 22 ++++++++++++++++++++-- 2 files changed, 21 insertions(+), 2 deletions(-) diff --git a/AUTHORS.rst b/AUTHORS.rst index 93bd537..0d7efd1 100644 --- a/AUTHORS.rst +++ b/AUTHORS.rst @@ -13,6 +13,7 @@ Contributors * Abel Daniel * Adam Chainz * Adam Wentz +* Adam Donaghy * Andrew Ingram (contributed setup.py) * Al Johri * Alex Alvarez diff --git a/polymorphic/query.py b/polymorphic/query.py index c2cc78f..6f979bc 100644 --- a/polymorphic/query.py +++ b/polymorphic/query.py @@ -5,6 +5,7 @@ QuerySet for PolymorphicModel import copy from collections import defaultdict +from django import get_version as get_django_version from django.contrib.contenttypes.models import ContentType from django.core.exceptions import FieldDoesNotExist from django.db.models.query import ModelIterable, Q, QuerySet @@ -157,7 +158,7 @@ class PolymorphicQuerySet(QuerySet): # Implementation in _translate_polymorphic_filter_defnition.""" return self.filter(not_instance_of=args) - def _filter_or_exclude(self, negate, args, kwargs): + def _filter_or_exclude(self, negate, *args, **kwargs): # We override this internal Django functon as it is used for all filter member functions. q_objects = translate_polymorphic_filter_definitions_in_args( self.model, args, using=self.db @@ -167,7 +168,7 @@ class PolymorphicQuerySet(QuerySet): self.model, kwargs, using=self.db ) return super(PolymorphicQuerySet, self)._filter_or_exclude( - negate, (list(q_objects) + additional_args), kwargs + negate, *(list(q_objects) + additional_args), **kwargs ) def order_by(self, *field_names): @@ -522,3 +523,20 @@ class PolymorphicQuerySet(QuerySet): return olist clist = PolymorphicQuerySet._p_list_class(olist) return clist + + +if get_django_version() > "3.2": + class PolymorphicQuerySet(PolymorphicQuerySet): + def _filter_or_exclude(self, negate, args, kwargs): + # We override this internal Django functon as it is used for all filter member functions. + q_objects = translate_polymorphic_filter_definitions_in_args( + queryset_model=self.model, args=args, using=self.db + ) + # filter_field='data' + additional_args = translate_polymorphic_filter_definitions_in_kwargs( + queryset_model=self.model, kwargs=kwargs, using=self.db + ) + args = list(q_objects) + additional_args + return super(PolymorphicQuerySet, self)._filter_or_exclude( + negate=negate, args=args, kwargs=kwargs + ) \ No newline at end of file From d93f17846fb8a36c9f2bd83a80e0729297d4394f Mon Sep 17 00:00:00 2001 From: Adam Donaghy Date: Wed, 19 Aug 2020 18:04:20 +1000 Subject: [PATCH 3/5] Side load _filter_or_exclude to avoid recursion --- polymorphic/query.py | 30 +++++++++++++++--------------- 1 file changed, 15 insertions(+), 15 deletions(-) diff --git a/polymorphic/query.py b/polymorphic/query.py index 6f979bc..ea44813 100644 --- a/polymorphic/query.py +++ b/polymorphic/query.py @@ -525,18 +525,18 @@ class PolymorphicQuerySet(QuerySet): return clist -if get_django_version() > "3.2": - class PolymorphicQuerySet(PolymorphicQuerySet): - def _filter_or_exclude(self, negate, args, kwargs): - # We override this internal Django functon as it is used for all filter member functions. - q_objects = translate_polymorphic_filter_definitions_in_args( - queryset_model=self.model, args=args, using=self.db - ) - # filter_field='data' - additional_args = translate_polymorphic_filter_definitions_in_kwargs( - queryset_model=self.model, kwargs=kwargs, using=self.db - ) - args = list(q_objects) + additional_args - return super(PolymorphicQuerySet, self)._filter_or_exclude( - negate=negate, args=args, kwargs=kwargs - ) \ No newline at end of file +if get_django_version() >= "3.2": + def _filter_or_exclude(self, negate, args, kwargs): + # We override this internal Django functon as it is used for all filter member functions. + q_objects = translate_polymorphic_filter_definitions_in_args( + queryset_model=self.model, args=args, using=self.db + ) + # filter_field='data' + additional_args = translate_polymorphic_filter_definitions_in_kwargs( + queryset_model=self.model, kwargs=kwargs, using=self.db + ) + args = list(q_objects) + additional_args + return super(PolymorphicQuerySet, self)._filter_or_exclude( + negate=negate, args=args, kwargs=kwargs + ) + PolymorphicQuerySet._filter_or_exclude = _filter_or_exclude From 45215ff6c3d4538f49edecaf8573d74ec2eff6d0 Mon Sep 17 00:00:00 2001 From: Adam Donaghy Date: Wed, 19 Aug 2020 18:23:49 +1000 Subject: [PATCH 4/5] Add little docstring and typo fix --- polymorphic/query.py | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/polymorphic/query.py b/polymorphic/query.py index ea44813..54ee0ee 100644 --- a/polymorphic/query.py +++ b/polymorphic/query.py @@ -159,7 +159,7 @@ class PolymorphicQuerySet(QuerySet): return self.filter(not_instance_of=args) def _filter_or_exclude(self, negate, *args, **kwargs): - # We override this internal Django functon as it is used for all filter member functions. + # We override this internal Django function as it is used for all filter member functions. q_objects = translate_polymorphic_filter_definitions_in_args( self.model, args, using=self.db ) @@ -525,9 +525,10 @@ class PolymorphicQuerySet(QuerySet): return clist +# Makes _filter_or_exclude compatible with the change in signature introduced in django at 9c9a3fe if get_django_version() >= "3.2": def _filter_or_exclude(self, negate, args, kwargs): - # We override this internal Django functon as it is used for all filter member functions. + # We override this internal Django function as it is used for all filter member functions. q_objects = translate_polymorphic_filter_definitions_in_args( queryset_model=self.model, args=args, using=self.db ) From fa6808e9b35622bef7fd6d038ea61c4eaf5ee8c7 Mon Sep 17 00:00:00 2001 From: Adam Donaghy Date: Thu, 20 Aug 2020 12:34:17 +1000 Subject: [PATCH 5/5] Use conditional function definition --- polymorphic/query.py | 60 +++++++++++++++++++++----------------------- 1 file changed, 29 insertions(+), 31 deletions(-) diff --git a/polymorphic/query.py b/polymorphic/query.py index 54ee0ee..8b0259b 100644 --- a/polymorphic/query.py +++ b/polymorphic/query.py @@ -158,18 +158,34 @@ class PolymorphicQuerySet(QuerySet): # Implementation in _translate_polymorphic_filter_defnition.""" return self.filter(not_instance_of=args) - def _filter_or_exclude(self, negate, *args, **kwargs): - # We override this internal Django function as it is used for all filter member functions. - q_objects = translate_polymorphic_filter_definitions_in_args( - self.model, args, using=self.db - ) - # filter_field='data' - additional_args = translate_polymorphic_filter_definitions_in_kwargs( - self.model, kwargs, using=self.db - ) - return super(PolymorphicQuerySet, self)._filter_or_exclude( - negate, *(list(q_objects) + additional_args), **kwargs - ) + # Makes _filter_or_exclude compatible with the change in signature introduced in django at 9c9a3fe + if get_django_version() >= "3.2": + def _filter_or_exclude(self, negate, args, kwargs): + # We override this internal Django function as it is used for all filter member functions. + q_objects = translate_polymorphic_filter_definitions_in_args( + queryset_model=self.model, args=args, using=self.db + ) + # filter_field='data' + additional_args = translate_polymorphic_filter_definitions_in_kwargs( + queryset_model=self.model, kwargs=kwargs, using=self.db + ) + args = list(q_objects) + additional_args + return super(PolymorphicQuerySet, self)._filter_or_exclude( + negate=negate, args=args, kwargs=kwargs + ) + else: + def _filter_or_exclude(self, negate, *args, **kwargs): + # We override this internal Django function as it is used for all filter member functions. + q_objects = translate_polymorphic_filter_definitions_in_args( + self.model, args, using=self.db + ) + # filter_field='data' + additional_args = translate_polymorphic_filter_definitions_in_kwargs( + self.model, kwargs, using=self.db + ) + return super(PolymorphicQuerySet, self)._filter_or_exclude( + negate, *(list(q_objects) + additional_args), **kwargs + ) def order_by(self, *field_names): """translate the field paths in the args, then call vanilla order_by.""" @@ -522,22 +538,4 @@ class PolymorphicQuerySet(QuerySet): if not self.model.polymorphic_query_multiline_output: return olist clist = PolymorphicQuerySet._p_list_class(olist) - return clist - - -# Makes _filter_or_exclude compatible with the change in signature introduced in django at 9c9a3fe -if get_django_version() >= "3.2": - def _filter_or_exclude(self, negate, args, kwargs): - # We override this internal Django function as it is used for all filter member functions. - q_objects = translate_polymorphic_filter_definitions_in_args( - queryset_model=self.model, args=args, using=self.db - ) - # filter_field='data' - additional_args = translate_polymorphic_filter_definitions_in_kwargs( - queryset_model=self.model, kwargs=kwargs, using=self.db - ) - args = list(q_objects) + additional_args - return super(PolymorphicQuerySet, self)._filter_or_exclude( - negate=negate, args=args, kwargs=kwargs - ) - PolymorphicQuerySet._filter_or_exclude = _filter_or_exclude + return clist \ No newline at end of file