From 0425985dab3e468c5e9e2edde4e747888e554f50 Mon Sep 17 00:00:00 2001 From: Kike Isidoro Date: Fri, 2 Aug 2019 16:31:28 +0200 Subject: [PATCH 1/4] Check for filters defined on base filterset classes --- graphene_django/filter/tests/test_fields.py | 83 +++++++++++++++++++++ graphene_django/filter/utils.py | 22 +++--- 2 files changed, 96 insertions(+), 9 deletions(-) diff --git a/graphene_django/filter/tests/test_fields.py b/graphene_django/filter/tests/test_fields.py index 99876b6ab..026f90931 100644 --- a/graphene_django/filter/tests/test_fields.py +++ b/graphene_django/filter/tests/test_fields.py @@ -818,3 +818,86 @@ class Query(ObjectType): } """ ) + + +def test_filter_filterset_based_on_mixin(): + class ArticleFilterMixin: + + @classmethod + def get_filters(cls): + filters = super().get_filters() + filters.update({ + 'viewer__email__in': django_filters.CharFilter( + method='filter_email_in', + field_name='reporter__email__in', + ), + }) + + return filters + + class NewArticleFilter(ArticleFilterMixin, ArticleFilter): + pass + + class NewReporterNode(DjangoObjectType): + class Meta: + model = Reporter + interfaces = (Node,) + + class NewArticleFilterNode(DjangoObjectType): + viewer = Field(NewReporterNode) + + class Meta: + model = Article + interfaces = (Node,) + filterset_class = NewArticleFilter + + def resolve_viewer(self, info): + return self.reporter + + class Query(ObjectType): + all_articles = DjangoFilterConnectionField(NewArticleFilterNode) + + reporter = Reporter.objects.create( + first_name="John", last_name="Doe", email="john@doe.com") + + article = Article.objects.create( + headline="Hello", + reporter=reporter, + editor=reporter, + pub_date=datetime.now(), + pub_date_time=datetime.now()) + + schema = Schema(query=Query) + + query = """ + query NodeFilteringQuery { + allArticles { + edges { + node { + viewer { + email + } + } + } + } + } + """ + + expected = { + "allArticles": { + "edges": [ + { + "node": { + "viewer": { + "email": reporter.email, + } + } + } + ] + } + } + + result = schema.execute(query) + + assert not result.errors + assert result.data == expected diff --git a/graphene_django/filter/utils.py b/graphene_django/filter/utils.py index 00030a00a..81efb638e 100644 --- a/graphene_django/filter/utils.py +++ b/graphene_django/filter/utils.py @@ -13,21 +13,25 @@ def get_filtering_args_from_filterset(filterset_class, type): args = {} model = filterset_class._meta.model for name, filter_field in six.iteritems(filterset_class.base_filters): + form_field = None + if name in filterset_class.declared_filters: form_field = filter_field.field else: field_name = name.split("__", 1)[0] - model_field = model._meta.get_field(field_name) - if hasattr(model_field, "formfield"): - form_field = model_field.formfield( - required=filter_field.extra.get("required", False) - ) + if hasattr(model, field_name): + model_field = model._meta.get_field(field_name) + + if hasattr(model_field, "formfield"): + form_field = model_field.formfield( + required=filter_field.extra.get("required", False) + ) - # Fallback to field defined on filter if we can't get it from the - # model field - if not form_field: - form_field = filter_field.field + # Fallback to field defined on filter if we can't get it from the + # model field + if not form_field: + form_field = filter_field.field field_type = convert_form_field(form_field).Argument() field_type.description = filter_field.label From 1d0473cda6cecdc80489c9dd2875878f4a82f608 Mon Sep 17 00:00:00 2001 From: Kike Isidoro Date: Fri, 2 Aug 2019 17:06:49 +0200 Subject: [PATCH 2/4] Make python2.7 compatible and run black --- graphene_django/filter/tests/test_fields.py | 36 ++++++++------------- 1 file changed, 14 insertions(+), 22 deletions(-) diff --git a/graphene_django/filter/tests/test_fields.py b/graphene_django/filter/tests/test_fields.py index 026f90931..f0c2a6c0f 100644 --- a/graphene_django/filter/tests/test_fields.py +++ b/graphene_django/filter/tests/test_fields.py @@ -821,17 +821,17 @@ class Query(ObjectType): def test_filter_filterset_based_on_mixin(): - class ArticleFilterMixin: - + class ArticleFilterMixin(FilterSet): @classmethod def get_filters(cls): - filters = super().get_filters() - filters.update({ - 'viewer__email__in': django_filters.CharFilter( - method='filter_email_in', - field_name='reporter__email__in', - ), - }) + filters = super(FilterSet, cls).get_filters() + filters.update( + { + "viewer__email__in": django_filters.CharFilter( + method="filter_email_in", field_name="reporter__email__in" + ) + } + ) return filters @@ -858,14 +858,16 @@ class Query(ObjectType): all_articles = DjangoFilterConnectionField(NewArticleFilterNode) reporter = Reporter.objects.create( - first_name="John", last_name="Doe", email="john@doe.com") + first_name="John", last_name="Doe", email="john@doe.com" + ) article = Article.objects.create( headline="Hello", reporter=reporter, editor=reporter, pub_date=datetime.now(), - pub_date_time=datetime.now()) + pub_date_time=datetime.now(), + ) schema = Schema(query=Query) @@ -884,17 +886,7 @@ class Query(ObjectType): """ expected = { - "allArticles": { - "edges": [ - { - "node": { - "viewer": { - "email": reporter.email, - } - } - } - ] - } + "allArticles": {"edges": [{"node": {"viewer": {"email": reporter.email}}}]} } result = schema.execute(query) From 472dc581f0aaecd0ee20a2912ab63af8602116ca Mon Sep 17 00:00:00 2001 From: Kike Isidoro Date: Tue, 6 Aug 2019 10:09:28 +0200 Subject: [PATCH 3/4] Add filter method and use filter in test --- graphene_django/filter/tests/test_fields.py | 32 ++++++++++++++++----- 1 file changed, 25 insertions(+), 7 deletions(-) diff --git a/graphene_django/filter/tests/test_fields.py b/graphene_django/filter/tests/test_fields.py index f0c2a6c0f..6d1745baf 100644 --- a/graphene_django/filter/tests/test_fields.py +++ b/graphene_django/filter/tests/test_fields.py @@ -835,6 +835,9 @@ def get_filters(cls): return filters + def filter_email_in(cls, queryset, name, value): + return queryset.filter(**{name: [value]}) + class NewArticleFilter(ArticleFilterMixin, ArticleFilter): pass @@ -857,23 +860,36 @@ def resolve_viewer(self, info): class Query(ObjectType): all_articles = DjangoFilterConnectionField(NewArticleFilterNode) - reporter = Reporter.objects.create( + reporter_1 = Reporter.objects.create( first_name="John", last_name="Doe", email="john@doe.com" ) - article = Article.objects.create( + article_1 = Article.objects.create( headline="Hello", - reporter=reporter, - editor=reporter, + reporter=reporter_1, + editor=reporter_1, + pub_date=datetime.now(), + pub_date_time=datetime.now(), + ) + + reporter_2 = Reporter.objects.create( + first_name="Adam", last_name="Doe", email="adam@doe.com" + ) + + article_2 = Article.objects.create( + headline="Good Bye", + reporter=reporter_2, + editor=reporter_2, pub_date=datetime.now(), pub_date_time=datetime.now(), ) schema = Schema(query=Query) - query = """ + query = ( + """ query NodeFilteringQuery { - allArticles { + allArticles(viewer_Email_In: "%s") { edges { node { viewer { @@ -884,9 +900,11 @@ class Query(ObjectType): } } """ + % reporter_1.email + ) expected = { - "allArticles": {"edges": [{"node": {"viewer": {"email": reporter.email}}}]} + "allArticles": {"edges": [{"node": {"viewer": {"email": reporter_1.email}}}]} } result = schema.execute(query) From 123aacdfbe350ffd4935c9883eb8f10e78fd0b3d Mon Sep 17 00:00:00 2001 From: Kike Isidoro Date: Tue, 6 Aug 2019 10:10:55 +0200 Subject: [PATCH 4/4] Check article headline and reformat --- graphene_django/filter/tests/test_fields.py | 12 +++++++++++- 1 file changed, 11 insertions(+), 1 deletion(-) diff --git a/graphene_django/filter/tests/test_fields.py b/graphene_django/filter/tests/test_fields.py index 6d1745baf..aa6a903ba 100644 --- a/graphene_django/filter/tests/test_fields.py +++ b/graphene_django/filter/tests/test_fields.py @@ -892,6 +892,7 @@ class Query(ObjectType): allArticles(viewer_Email_In: "%s") { edges { node { + headline viewer { email } @@ -904,7 +905,16 @@ class Query(ObjectType): ) expected = { - "allArticles": {"edges": [{"node": {"viewer": {"email": reporter_1.email}}}]} + "allArticles": { + "edges": [ + { + "node": { + "headline": article_1.headline, + "viewer": {"email": reporter_1.email}, + } + } + ] + } } result = schema.execute(query)