|
1 | 1 | from collections import OrderedDict |
2 | | -from functools import singledispatch |
| 2 | +from functools import singledispatch, partial, wraps |
3 | 3 |
|
4 | 4 | from django.db import models |
5 | 5 | from django.utils.encoding import force_str |
6 | 6 | from django.utils.functional import Promise |
7 | 7 | from django.utils.module_loading import import_string |
| 8 | + |
8 | 9 | from graphene import ( |
9 | 10 | ID, |
10 | 11 | UUID, |
|
22 | 23 | Time, |
23 | 24 | Decimal, |
24 | 25 | ) |
| 26 | +from graphene.types.resolver import get_default_resolver |
25 | 27 | from graphene.types.json import JSONString |
26 | 28 | from graphene.utils.str_converters import to_camel_case |
27 | 29 | from graphql import GraphQLError, assert_valid_name |
|
33 | 35 | from .utils.str_converters import to_const |
34 | 36 |
|
35 | 37 |
|
| 38 | +class BlankValueField(Field): |
| 39 | + def get_resolver(self, parent_resolver): |
| 40 | + resolver = self.resolver or parent_resolver |
| 41 | + |
| 42 | + # create custom resolver |
| 43 | + def blank_field_wrapper(func): |
| 44 | + @wraps(func) |
| 45 | + def wrapped_resolver(*args, **kwargs): |
| 46 | + return_value = func(*args, **kwargs) |
| 47 | + if return_value == "": |
| 48 | + return None |
| 49 | + return return_value |
| 50 | + |
| 51 | + return wrapped_resolver |
| 52 | + |
| 53 | + return blank_field_wrapper(resolver) |
| 54 | + |
| 55 | + |
36 | 56 | def convert_choice_name(name): |
37 | 57 | name = to_const(force_str(name)) |
38 | 58 | try: |
@@ -71,7 +91,8 @@ class EnumWithDescriptionsType(object): |
71 | 91 | def description(self): |
72 | 92 | return str(named_choices_descriptions[self.name]) |
73 | 93 |
|
74 | | - return Enum(name, list(named_choices), type=EnumWithDescriptionsType) |
| 94 | + return_type = Enum(name, list(named_choices), type=EnumWithDescriptionsType) |
| 95 | + return return_type |
75 | 96 |
|
76 | 97 |
|
77 | 98 | def generate_enum_name(django_model_meta, field): |
@@ -108,11 +129,12 @@ def convert_django_field_with_choices( |
108 | 129 | return converted |
109 | 130 | choices = getattr(field, "choices", None) |
110 | 131 | if choices and convert_choices_to_enum: |
111 | | - enum = convert_choice_field_to_enum(field) |
| 132 | + EnumCls = convert_choice_field_to_enum(field) |
112 | 133 | required = not (field.blank or field.null) |
113 | | - converted = enum( |
| 134 | + |
| 135 | + converted = EnumCls( |
114 | 136 | description=get_django_field_description(field), required=required |
115 | | - ) |
| 137 | + ).mount_as(BlankValueField) |
116 | 138 | else: |
117 | 139 | converted = convert_django_field(field, registry) |
118 | 140 | if registry is not None: |
|
0 commit comments