mirror of
https://github.com/graphql-python/graphene-django.git
synced 2025-06-15 19:13:12 +03:00
fix: declaration of required variable in filters v2 (#1136)
* fix: declaration of required variable * Add unit test * Fix flaky test * Formatting * Fix for python 2.7 Co-authored-by: Thomas Leonard <thomas@loftorbital.com>
This commit is contained in:
parent
e323e2bc0b
commit
6f1389c039
|
@ -69,7 +69,11 @@ def convert_choices_to_named_enum_with_descriptions(name, choices):
|
||||||
def description(self):
|
def description(self):
|
||||||
return named_choices_descriptions[self.name]
|
return named_choices_descriptions[self.name]
|
||||||
|
|
||||||
return Enum(name, list(named_choices), type=EnumWithDescriptionsType)
|
if named_choices == []:
|
||||||
|
# Python 2.7 doesn't handle enums with lists with zero entries, but works okay with empty sets
|
||||||
|
named_choices = set()
|
||||||
|
|
||||||
|
return Enum(name, named_choices, type=EnumWithDescriptionsType)
|
||||||
|
|
||||||
|
|
||||||
def generate_enum_name(django_model_meta, field):
|
def generate_enum_name(django_model_meta, field):
|
||||||
|
|
|
@ -135,10 +135,22 @@ def test_filter_enum_field_schema_type(schema):
|
||||||
in schema_str
|
in schema_str
|
||||||
)
|
)
|
||||||
|
|
||||||
assert (
|
filters = {
|
||||||
"""type Query {
|
"offset": "Int",
|
||||||
allReporters(offset: Int, before: String, after: String, first: Int, last: Int): ReporterTypeConnection
|
"before": "String",
|
||||||
allArticles(offset: Int, before: String, after: String, first: Int, last: Int, lang: ArticleLang, lang_In: [ArticleLang], reporter_AChoice: ReporterAChoice, reporter_AChoice_In: [ReporterAChoice]): ArticleTypeConnection
|
"after": "String",
|
||||||
}"""
|
"first": "Int",
|
||||||
in schema_str
|
"last": "Int",
|
||||||
|
"lang": "ArticleLang",
|
||||||
|
"lang_In": "[ArticleLang]",
|
||||||
|
"reporter_AChoice": "ReporterAChoice",
|
||||||
|
"reporter_AChoice_In": "[ReporterAChoice]",
|
||||||
|
}
|
||||||
|
|
||||||
|
all_articles_filters = (
|
||||||
|
schema_str.split(" allArticles(")[1]
|
||||||
|
.split("): ArticleTypeConnection\n")[0]
|
||||||
|
.split(", ")
|
||||||
)
|
)
|
||||||
|
for filter_field, gql_type in filters.items():
|
||||||
|
assert "{}: {}".format(filter_field, gql_type) in all_articles_filters
|
||||||
|
|
|
@ -16,7 +16,7 @@ pytestmark = []
|
||||||
|
|
||||||
if DJANGO_FILTER_INSTALLED:
|
if DJANGO_FILTER_INSTALLED:
|
||||||
import django_filters
|
import django_filters
|
||||||
from django_filters import FilterSet, NumberFilter
|
from django_filters import FilterSet, NumberFilter, OrderingFilter
|
||||||
|
|
||||||
from graphene_django.filter import (
|
from graphene_django.filter import (
|
||||||
GlobalIDFilter,
|
GlobalIDFilter,
|
||||||
|
@ -1216,3 +1216,22 @@ def test_filter_string_contains():
|
||||||
assert result.data == {
|
assert result.data == {
|
||||||
"people": {"edges": [{"node": {"name": "Joe"}}, {"node": {"name": "Bob"}},]}
|
"people": {"edges": [{"node": {"name": "Joe"}}, {"node": {"name": "Bob"}},]}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
def test_only_custom_filters():
|
||||||
|
class ReporterFilter(FilterSet):
|
||||||
|
class Meta:
|
||||||
|
model = Reporter
|
||||||
|
fields = []
|
||||||
|
|
||||||
|
some_filter = OrderingFilter(fields=("name",))
|
||||||
|
|
||||||
|
class ReporterFilterNode(DjangoObjectType):
|
||||||
|
class Meta:
|
||||||
|
model = Reporter
|
||||||
|
interfaces = (Node,)
|
||||||
|
fields = "__all__"
|
||||||
|
filterset_class = ReporterFilter
|
||||||
|
|
||||||
|
field = DjangoFilterConnectionField(ReporterFilterNode)
|
||||||
|
assert_arguments(field, "some_filter")
|
||||||
|
|
|
@ -39,6 +39,7 @@ def get_filtering_args_from_filterset(filterset_class, type):
|
||||||
registry = type._meta.registry
|
registry = type._meta.registry
|
||||||
for name, filter_field in six.iteritems(filterset_class.base_filters):
|
for name, filter_field in six.iteritems(filterset_class.base_filters):
|
||||||
filter_type = filter_field.lookup_expr
|
filter_type = filter_field.lookup_expr
|
||||||
|
required = filter_field.extra.get("required", False)
|
||||||
field_type = None
|
field_type = None
|
||||||
form_field = None
|
form_field = None
|
||||||
|
|
||||||
|
@ -49,8 +50,6 @@ def get_filtering_args_from_filterset(filterset_class, type):
|
||||||
or isinstance(filter_field, ArrayFilter)
|
or isinstance(filter_field, ArrayFilter)
|
||||||
):
|
):
|
||||||
# Get the filter field for filters that are no explicitly declared.
|
# Get the filter field for filters that are no explicitly declared.
|
||||||
|
|
||||||
required = filter_field.extra.get("required", False)
|
|
||||||
if filter_type == "isnull":
|
if filter_type == "isnull":
|
||||||
field = graphene.Boolean(required=required)
|
field = graphene.Boolean(required=required)
|
||||||
else:
|
else:
|
||||||
|
|
Loading…
Reference in New Issue
Block a user