From 226a1d0e3a68c922aae5236f0fd7d3584ecc0e99 Mon Sep 17 00:00:00 2001 From: Sergio Date: Mon, 15 Oct 2018 14:34:56 -0500 Subject: [PATCH 1/5] #534 add filterset validation to DjangoFilterConnectionField --- graphene_django/filter/fields.py | 16 ++++++++++++++-- 1 file changed, 14 insertions(+), 2 deletions(-) diff --git a/graphene_django/filter/fields.py b/graphene_django/filter/fields.py index cb4254370..ff07a89c9 100644 --- a/graphene_django/filter/fields.py +++ b/graphene_django/filter/fields.py @@ -1,6 +1,7 @@ from collections import OrderedDict from functools import partial +from graphql.error import GraphQLError from graphene.types.argument import to_arguments from ..fields import DjangoConnectionField from .utils import get_filtering_args_from_filterset, get_filterset_class @@ -89,11 +90,22 @@ def connection_resolver( **args ): filter_kwargs = {k: v for k, v in args.items() if k in filtering_args} - qs = filterset_class( + + filterset = filterset_class( data=filter_kwargs, queryset=default_manager.get_queryset(), request=info.context, - ).qs + ) + + if not filterset.is_valid(): + exc = { + key: [e.message for e in error_list] + for key, error_list in filterset.errors.as_data().items() + } + + raise GraphQLError(exc) + + qs = filterset.qs return super(DjangoFilterConnectionField, cls).connection_resolver( resolver, From a32d09162586d71c4f904a0350baacf56aadf695 Mon Sep 17 00:00:00 2001 From: Sergio Date: Mon, 15 Oct 2018 15:17:37 -0500 Subject: [PATCH 2/5] #534 test added --- graphene_django/filter/tests/test_fields.py | 31 +++++++++++++++++++++ 1 file changed, 31 insertions(+) diff --git a/graphene_django/filter/tests/test_fields.py b/graphene_django/filter/tests/test_fields.py index f9ef0ae2f..18fdad65b 100644 --- a/graphene_django/filter/tests/test_fields.py +++ b/graphene_django/filter/tests/test_fields.py @@ -290,6 +290,37 @@ class Query(ObjectType): ) +def test_filter_filterset_validation_errors(): + class ReporterFilterNode(DjangoObjectType): + class Meta: + model = Reporter + interfaces = (Node,) + filter_fields = ("id",) + + class Query(ObjectType): + all_reporters = DjangoFilterConnectionField(ReporterFilterNode) + + r1 = Reporter.objects.create(first_name="r1", last_name="r1", email="r1@test.com") + + query = """ + query { + allReporters(id:"foo") { + edges { + node { + id + } + } + } + } + """ + schema = Schema(query=Query) + result = schema.execute(query) + + assert result.errors + # We should get back an error message + assert result.to_dict()['errors'][0]["message"] == "{'id': ['Invalid ID specified.']}" + + def test_global_id_field_implicit(): field = DjangoFilterConnectionField(ArticleNode, fields=["id"]) filterset_class = field.filterset_class From 016321c405cb1dd10b9a367520930659593abc69 Mon Sep 17 00:00:00 2001 From: Sergio Date: Mon, 29 Oct 2018 19:56:53 -0500 Subject: [PATCH 3/5] Added support for django-filter < 2 --- graphene_django/filter/fields.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/graphene_django/filter/fields.py b/graphene_django/filter/fields.py index ff07a89c9..03219df27 100644 --- a/graphene_django/filter/fields.py +++ b/graphene_django/filter/fields.py @@ -97,7 +97,7 @@ def connection_resolver( request=info.context, ) - if not filterset.is_valid(): + if not (filterset.is_bound and filterset.form.is_valid()): exc = { key: [e.message for e in error_list] for key, error_list in filterset.errors.as_data().items() From edc5c880d17fd81da8d6c162ef51e77d3619ef2a Mon Sep 17 00:00:00 2001 From: Sergio Date: Tue, 30 Oct 2018 08:56:52 -0500 Subject: [PATCH 4/5] added support for django_filter < 2 --- graphene_django/filter/fields.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/graphene_django/filter/fields.py b/graphene_django/filter/fields.py index 03219df27..af5f3aab6 100644 --- a/graphene_django/filter/fields.py +++ b/graphene_django/filter/fields.py @@ -100,7 +100,7 @@ def connection_resolver( if not (filterset.is_bound and filterset.form.is_valid()): exc = { key: [e.message for e in error_list] - for key, error_list in filterset.errors.as_data().items() + for key, error_list in filterset.form.errors.as_data().items() } raise GraphQLError(exc) From a8552223596279abc7c13d76be32485f3749646f Mon Sep 17 00:00:00 2001 From: Sergio Date: Tue, 30 Oct 2018 09:50:02 -0500 Subject: [PATCH 5/5] added support for python2.x --- graphene_django/filter/fields.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/graphene_django/filter/fields.py b/graphene_django/filter/fields.py index af5f3aab6..7dfd20a12 100644 --- a/graphene_django/filter/fields.py +++ b/graphene_django/filter/fields.py @@ -99,7 +99,7 @@ def connection_resolver( if not (filterset.is_bound and filterset.form.is_valid()): exc = { - key: [e.message for e in error_list] + str(key): [str(e.message) for e in error_list] for key, error_list in filterset.form.errors.as_data().items() }