From 45c2aa09b5bf56a19ce383aa9effd14072acb500 Mon Sep 17 00:00:00 2001 From: Alisson Patricio Date: Wed, 20 Mar 2024 13:48:51 -0300 Subject: [PATCH] Allows field's choices to be a callable (#1497) * Allows field's choices to be a callable Starting in Django 5 field's choices can also be a callable * test if field with callable choices converts into enum --------- Co-authored-by: Kien Dang --- graphene_django/converter.py | 3 +++ graphene_django/tests/test_converter.py | 20 ++++++++++++++++++++ 2 files changed, 23 insertions(+) diff --git a/graphene_django/converter.py b/graphene_django/converter.py index 9d15af2ee..7eba22a1d 100644 --- a/graphene_django/converter.py +++ b/graphene_django/converter.py @@ -1,4 +1,5 @@ import inspect +from collections.abc import Callable from functools import partial, singledispatch, wraps from django.db import models @@ -71,6 +72,8 @@ def convert_choice_name(name): def get_choices(choices): converted_names = [] + if isinstance(choices, Callable): + choices = choices() # In restframework==3.15.0, choices are not passed # as OrderedDict anymore, so it's safer to check diff --git a/graphene_django/tests/test_converter.py b/graphene_django/tests/test_converter.py index e8c09208c..2f8b1d515 100644 --- a/graphene_django/tests/test_converter.py +++ b/graphene_django/tests/test_converter.py @@ -180,6 +180,26 @@ class Meta: assert graphene_type._meta.enum.__members__["EN"].description == "English" +def test_field_with_callable_choices_convert_enum(): + def get_choices(): + return ("es", "Spanish"), ("en", "English") + + field = models.CharField(help_text="Language", choices=get_choices) + + class TranslatedModel(models.Model): + language = field + + class Meta: + app_label = "test" + + graphene_type = convert_django_field_with_choices(field).type.of_type + assert graphene_type._meta.name == "TestTranslatedModelLanguageChoices" + assert graphene_type._meta.enum.__members__["ES"].value == "es" + assert graphene_type._meta.enum.__members__["ES"].description == "Spanish" + assert graphene_type._meta.enum.__members__["EN"].value == "en" + assert graphene_type._meta.enum.__members__["EN"].description == "English" + + def test_field_with_grouped_choices(): field = models.CharField( help_text="Language",