4
4
import six
5
5
from graphql .core .type import GraphQLField , GraphQLInputObjectField
6
6
7
+ from ...utils import maybe_func
7
8
from ..classtypes .base import FieldsClassType
8
9
from ..classtypes .inputobjecttype import InputObjectType
9
10
from ..classtypes .mutation import Mutation
@@ -18,7 +19,8 @@ class Field(NamedType, OrderedType):
18
19
19
20
def __init__ (
20
21
self , type , description = None , args = None , name = None , resolver = None ,
21
- required = False , default = None , deprecation_reason = None , * args_list , ** kwargs ):
22
+ source = None , required = False , default = None , deprecation_reason = None ,
23
+ * args_list , ** kwargs ):
22
24
_creation_counter = kwargs .pop ('_creation_counter' , None )
23
25
if isinstance (name , (Argument , ArgumentType )):
24
26
kwargs ['name' ] = name
@@ -33,7 +35,12 @@ def __init__(
33
35
args = OrderedDict (args or {}, ** kwargs )
34
36
self .arguments = ArgumentsGroup (* args_list , ** args )
35
37
self .object_type = None
38
+ self .attname = None
39
+ self .default_name = None
36
40
self .resolver_fn = resolver
41
+ self .source = source
42
+ assert not (self .source and self .resolver_fn ), ('You cannot have a source'
43
+ ' and a resolver at the same time' )
37
44
self .default = default
38
45
39
46
def contribute_to_class (self , cls , attname ):
@@ -68,7 +75,8 @@ def get_resolver_fn(self):
68
75
return getattr (self .object_type , resolve_fn_name )
69
76
70
77
def default_getter (instance , args , info ):
71
- return getattr (instance , self .attname , self .default )
78
+ value = getattr (instance , self .source or self .attname , self .default )
79
+ return maybe_func (value )
72
80
return default_getter
73
81
74
82
def get_type (self , schema ):
@@ -80,6 +88,8 @@ def decorate_resolver(self, resolver):
80
88
return snake_case_args (resolver )
81
89
82
90
def internal_type (self , schema ):
91
+ if not self .object_type :
92
+ raise Exception ('The field is not mounted in any ClassType' )
83
93
resolver = self .resolver
84
94
description = self .description
85
95
arguments = self .arguments
0 commit comments