|
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