mirror of
https://github.com/graphql-python/graphene-django.git
synced 2025-04-08 11:14:19 +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):
|
||||
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):
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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")
|
||||
|
|
|
@ -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:
|
||||
|
|
Loading…
Reference in New Issue
Block a user