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:
Thomas Leonard 2021-03-11 01:49:58 +01:00 committed by GitHub
parent e323e2bc0b
commit 6f1389c039
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
4 changed files with 44 additions and 10 deletions

View File

@ -69,7 +69,11 @@ def convert_choices_to_named_enum_with_descriptions(name, choices):
def description(self):
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):

View File

@ -135,10 +135,22 @@ def test_filter_enum_field_schema_type(schema):
in schema_str
)
assert (
"""type Query {
allReporters(offset: Int, before: String, after: String, first: Int, last: Int): ReporterTypeConnection
allArticles(offset: Int, before: String, after: String, first: Int, last: Int, lang: ArticleLang, lang_In: [ArticleLang], reporter_AChoice: ReporterAChoice, reporter_AChoice_In: [ReporterAChoice]): ArticleTypeConnection
}"""
in schema_str
filters = {
"offset": "Int",
"before": "String",
"after": "String",
"first": "Int",
"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

View File

@ -16,7 +16,7 @@ pytestmark = []
if DJANGO_FILTER_INSTALLED:
import django_filters
from django_filters import FilterSet, NumberFilter
from django_filters import FilterSet, NumberFilter, OrderingFilter
from graphene_django.filter import (
GlobalIDFilter,
@ -1216,3 +1216,22 @@ def test_filter_string_contains():
assert result.data == {
"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")

View File

@ -39,6 +39,7 @@ def get_filtering_args_from_filterset(filterset_class, type):
registry = type._meta.registry
for name, filter_field in six.iteritems(filterset_class.base_filters):
filter_type = filter_field.lookup_expr
required = filter_field.extra.get("required", False)
field_type = None
form_field = None
@ -49,8 +50,6 @@ def get_filtering_args_from_filterset(filterset_class, type):
or isinstance(filter_field, ArrayFilter)
):
# Get the filter field for filters that are no explicitly declared.
required = filter_field.extra.get("required", False)
if filter_type == "isnull":
field = graphene.Boolean(required=required)
else: