Skip to content

Commit

Permalink
Allows field's choices to be a callable (#1497)
Browse files Browse the repository at this point in the history
* 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 <mail@kien.ai>
  • Loading branch information
nossila and kiendang authored Mar 20, 2024
1 parent ac09cd2 commit 45c2aa0
Show file tree
Hide file tree
Showing 2 changed files with 23 additions and 0 deletions.
3 changes: 3 additions & 0 deletions graphene_django/converter.py
Original file line number Diff line number Diff line change
@@ -1,4 +1,5 @@
import inspect
from collections.abc import Callable
from functools import partial, singledispatch, wraps

from django.db import models
Expand Down Expand Up @@ -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
Expand Down
20 changes: 20 additions & 0 deletions graphene_django/tests/test_converter.py
Original file line number Diff line number Diff line change
Expand Up @@ -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",
Expand Down

0 comments on commit 45c2aa0

Please sign in to comment.