1
1
import inspect
2
- from collections .abc import Callable
3
2
from functools import partial , singledispatch , wraps
4
3
5
4
from django .db import models
37
36
from graphql import assert_valid_name as assert_name
38
37
from graphql .pyutils import register_description
39
38
40
- from .compat import ArrayField , HStoreField , RangeField
39
+ from .compat import ArrayField , HStoreField , RangeField , normalize_choices
41
40
from .fields import DjangoConnectionField , DjangoListField
42
41
from .settings import graphene_settings
43
42
from .utils .str_converters import to_const
@@ -61,6 +60,24 @@ def wrapped_resolver(*args, **kwargs):
61
60
return blank_field_wrapper (resolver )
62
61
63
62
63
+ class EnumValueField (Field ):
64
+ def wrap_resolve (self , parent_resolver ):
65
+ resolver = self .resolver or parent_resolver
66
+
67
+ # create custom resolver
68
+ def enum_field_wrapper (func ):
69
+ @wraps (func )
70
+ def wrapped_resolver (* args , ** kwargs ):
71
+ return_value = func (* args , ** kwargs )
72
+ if isinstance (return_value , models .Choices ):
73
+ return_value = return_value .value
74
+ return return_value
75
+
76
+ return wrapped_resolver
77
+
78
+ return enum_field_wrapper (resolver )
79
+
80
+
64
81
def convert_choice_name (name ):
65
82
name = to_const (force_str (name ))
66
83
try :
@@ -72,15 +89,7 @@ def convert_choice_name(name):
72
89
73
90
def get_choices (choices ):
74
91
converted_names = []
75
- if isinstance (choices , Callable ):
76
- choices = choices ()
77
-
78
- # In restframework==3.15.0, choices are not passed
79
- # as OrderedDict anymore, so it's safer to check
80
- # for a dict
81
- if isinstance (choices , dict ):
82
- choices = choices .items ()
83
-
92
+ choices = normalize_choices (choices )
84
93
for value , help_text in choices :
85
94
if isinstance (help_text , (tuple , list )):
86
95
yield from get_choices (help_text )
@@ -157,7 +166,7 @@ def convert_django_field_with_choices(
157
166
158
167
converted = EnumCls (
159
168
description = get_django_field_description (field ), required = required
160
- ).mount_as (BlankValueField )
169
+ ).mount_as (EnumValueField )
161
170
else :
162
171
converted = convert_django_field (field , registry )
163
172
if registry is not None :
0 commit comments