diff --git a/graphene_django/converter.py b/graphene_django/converter.py index 63cc35d..b744e51 100644 --- a/graphene_django/converter.py +++ b/graphene_django/converter.py @@ -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): diff --git a/graphene_django/filter/tests/test_enum_filtering.py b/graphene_django/filter/tests/test_enum_filtering.py index 650c55e..0fe572c 100644 --- a/graphene_django/filter/tests/test_enum_filtering.py +++ b/graphene_django/filter/tests/test_enum_filtering.py @@ -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 diff --git a/graphene_django/filter/tests/test_fields.py b/graphene_django/filter/tests/test_fields.py index d3e86a5..86b377a 100644 --- a/graphene_django/filter/tests/test_fields.py +++ b/graphene_django/filter/tests/test_fields.py @@ -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") diff --git a/graphene_django/filter/utils.py b/graphene_django/filter/utils.py index 2638656..30213a3 100644 --- a/graphene_django/filter/utils.py +++ b/graphene_django/filter/utils.py @@ -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: