mirror of
https://github.com/graphql-python/graphene-django.git
synced 2025-02-24 15:47:31 +03:00
Fix filtering with GlobalIDFilter (#977)
This commit is contained in:
parent
48bfc395ee
commit
3c6733e121
|
@ -1,6 +1,7 @@
|
||||||
from collections import OrderedDict
|
from collections import OrderedDict
|
||||||
from functools import partial
|
from functools import partial
|
||||||
|
|
||||||
|
from django.core.exceptions import ValidationError
|
||||||
from graphene.types.argument import to_arguments
|
from graphene.types.argument import to_arguments
|
||||||
from ..fields import DjangoConnectionField
|
from ..fields import DjangoConnectionField
|
||||||
from .utils import get_filtering_args_from_filterset, get_filterset_class
|
from .utils import get_filtering_args_from_filterset, get_filterset_class
|
||||||
|
@ -59,7 +60,12 @@ class DjangoFilterConnectionField(DjangoConnectionField):
|
||||||
connection, iterable, info, args
|
connection, iterable, info, args
|
||||||
)
|
)
|
||||||
filter_kwargs = {k: v for k, v in args.items() if k in filtering_args}
|
filter_kwargs = {k: v for k, v in args.items() if k in filtering_args}
|
||||||
return filterset_class(data=filter_kwargs, queryset=qs, request=info.context).qs
|
filterset = filterset_class(
|
||||||
|
data=filter_kwargs, queryset=qs, request=info.context
|
||||||
|
)
|
||||||
|
if filterset.form.is_valid():
|
||||||
|
return filterset.qs
|
||||||
|
raise ValidationError(filterset.form.errors.as_json())
|
||||||
|
|
||||||
def get_queryset_resolver(self):
|
def get_queryset_resolver(self):
|
||||||
return partial(
|
return partial(
|
||||||
|
|
|
@ -400,6 +400,114 @@ def test_global_id_field_relation():
|
||||||
assert id_filter.field_class == GlobalIDFormField
|
assert id_filter.field_class == GlobalIDFormField
|
||||||
|
|
||||||
|
|
||||||
|
def test_global_id_field_relation_with_filter():
|
||||||
|
class ReporterFilterNode(DjangoObjectType):
|
||||||
|
class Meta:
|
||||||
|
model = Reporter
|
||||||
|
interfaces = (Node,)
|
||||||
|
filter_fields = ["first_name", "articles"]
|
||||||
|
|
||||||
|
class ArticleFilterNode(DjangoObjectType):
|
||||||
|
class Meta:
|
||||||
|
model = Article
|
||||||
|
interfaces = (Node,)
|
||||||
|
filter_fields = ["headline", "reporter"]
|
||||||
|
|
||||||
|
class Query(ObjectType):
|
||||||
|
all_reporters = DjangoFilterConnectionField(ReporterFilterNode)
|
||||||
|
all_articles = DjangoFilterConnectionField(ArticleFilterNode)
|
||||||
|
reporter = Field(ReporterFilterNode)
|
||||||
|
article = Field(ArticleFilterNode)
|
||||||
|
|
||||||
|
r1 = Reporter.objects.create(first_name="r1", last_name="r1", email="r1@test.com")
|
||||||
|
r2 = Reporter.objects.create(first_name="r2", last_name="r2", email="r2@test.com")
|
||||||
|
Article.objects.create(
|
||||||
|
headline="a1",
|
||||||
|
pub_date=datetime.now(),
|
||||||
|
pub_date_time=datetime.now(),
|
||||||
|
reporter=r1,
|
||||||
|
editor=r1,
|
||||||
|
)
|
||||||
|
Article.objects.create(
|
||||||
|
headline="a2",
|
||||||
|
pub_date=datetime.now(),
|
||||||
|
pub_date_time=datetime.now(),
|
||||||
|
reporter=r2,
|
||||||
|
editor=r2,
|
||||||
|
)
|
||||||
|
|
||||||
|
# Query articles created by the reporter `r1`
|
||||||
|
query = """
|
||||||
|
query {
|
||||||
|
allArticles (reporter: "UmVwb3J0ZXJGaWx0ZXJOb2RlOjE=") {
|
||||||
|
edges {
|
||||||
|
node {
|
||||||
|
id
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
"""
|
||||||
|
schema = Schema(query=Query)
|
||||||
|
result = schema.execute(query)
|
||||||
|
assert not result.errors
|
||||||
|
# We should only get back a single article
|
||||||
|
assert len(result.data["allArticles"]["edges"]) == 1
|
||||||
|
|
||||||
|
|
||||||
|
def test_global_id_field_relation_with_filter_not_valid_id():
|
||||||
|
class ReporterFilterNode(DjangoObjectType):
|
||||||
|
class Meta:
|
||||||
|
model = Reporter
|
||||||
|
interfaces = (Node,)
|
||||||
|
filter_fields = ["first_name", "articles"]
|
||||||
|
|
||||||
|
class ArticleFilterNode(DjangoObjectType):
|
||||||
|
class Meta:
|
||||||
|
model = Article
|
||||||
|
interfaces = (Node,)
|
||||||
|
filter_fields = ["headline", "reporter"]
|
||||||
|
|
||||||
|
class Query(ObjectType):
|
||||||
|
all_reporters = DjangoFilterConnectionField(ReporterFilterNode)
|
||||||
|
all_articles = DjangoFilterConnectionField(ArticleFilterNode)
|
||||||
|
reporter = Field(ReporterFilterNode)
|
||||||
|
article = Field(ArticleFilterNode)
|
||||||
|
|
||||||
|
r1 = Reporter.objects.create(first_name="r1", last_name="r1", email="r1@test.com")
|
||||||
|
r2 = Reporter.objects.create(first_name="r2", last_name="r2", email="r2@test.com")
|
||||||
|
Article.objects.create(
|
||||||
|
headline="a1",
|
||||||
|
pub_date=datetime.now(),
|
||||||
|
pub_date_time=datetime.now(),
|
||||||
|
reporter=r1,
|
||||||
|
editor=r1,
|
||||||
|
)
|
||||||
|
Article.objects.create(
|
||||||
|
headline="a2",
|
||||||
|
pub_date=datetime.now(),
|
||||||
|
pub_date_time=datetime.now(),
|
||||||
|
reporter=r2,
|
||||||
|
editor=r2,
|
||||||
|
)
|
||||||
|
|
||||||
|
# Filter by the global ID that does not exist
|
||||||
|
query = """
|
||||||
|
query {
|
||||||
|
allArticles (reporter: "fake_global_id") {
|
||||||
|
edges {
|
||||||
|
node {
|
||||||
|
id
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
"""
|
||||||
|
schema = Schema(query=Query)
|
||||||
|
result = schema.execute(query)
|
||||||
|
assert "Invalid ID specified." in result.errors[0].message
|
||||||
|
|
||||||
|
|
||||||
def test_global_id_multiple_field_implicit():
|
def test_global_id_multiple_field_implicit():
|
||||||
field = DjangoFilterConnectionField(ReporterNode, fields=["pets"])
|
field = DjangoFilterConnectionField(ReporterNode, fields=["pets"])
|
||||||
filterset_class = field.filterset_class
|
filterset_class = field.filterset_class
|
||||||
|
|
Loading…
Reference in New Issue
Block a user