1- import inspect
2-
31from collections import OrderedDict
42from functools import partial
53
4+ # from graphene.relay import is_node
65from graphene .types .argument import to_arguments
76from ..fields import DjangoConnectionField
8- from graphene .relay import is_node
97from .utils import get_filtering_args_from_filterset , get_filterset_class
108
119
@@ -15,47 +13,12 @@ def __init__(self, type, fields=None, order_by=None,
1513 extra_filter_meta = None , filterset_class = None ,
1614 * args , ** kwargs ):
1715 self ._fields = fields
18- self ._type = type
19- self ._filterset_class = filterset_class
16+ self ._provided_filterset_class = filterset_class
17+ self ._filterset_class = None
2018 self ._extra_filter_meta = extra_filter_meta
2119 self ._base_args = None
2220 super (DjangoFilterConnectionField , self ).__init__ (type , * args , ** kwargs )
2321
24- @property
25- def node_type (self ):
26- if inspect .isfunction (self ._type ) or inspect .ismethod (self ._type ):
27- return self ._type ()
28- return self ._type
29-
30- @property
31- def meta (self ):
32- if is_node (self .node_type ):
33- _model = self .node_type ._meta .model
34- else :
35- # ConnectionFields can also be passed Connections,
36- # in which case, we need to use the Node of the connection
37- # to get our relevant args.
38- _model = self .node_type ._meta .node ._meta .model
39-
40- meta = dict (model = _model ,
41- fields = self .fields )
42- if self ._extra_filter_meta :
43- meta .update (self ._extra_filter_meta )
44- return meta
45-
46- @property
47- def fields (self ):
48- if self ._fields :
49- return self ._fields
50-
51- if is_node (self .node_type ):
52- return self .node_type ._meta .filter_fields
53- else :
54- # ConnectionFields can also be passed Connections,
55- # in which case, we need to use the Node of the connection
56- # to get our relevant args.
57- return self .node_type ._meta .node ._meta .filter_fields
58-
5922 @property
6023 def args (self ):
6124 return to_arguments (self ._base_args or OrderedDict (), self .filtering_args )
@@ -66,7 +29,16 @@ def args(self, args):
6629
6730 @property
6831 def filterset_class (self ):
69- return get_filterset_class (self ._filterset_class , ** self .meta )
32+ if not self ._filterset_class :
33+ fields = self ._fields or self .node_type ._meta .filter_fields
34+ meta = dict (model = self .model ,
35+ fields = fields )
36+ if self ._extra_filter_meta :
37+ meta .update (self ._extra_filter_meta )
38+
39+ self ._filterset_class = get_filterset_class (self ._provided_filterset_class , ** meta )
40+
41+ return self ._filterset_class
7042
7143 @property
7244 def filtering_args (self ):
@@ -76,8 +48,10 @@ def filtering_args(self):
7648 def connection_resolver (resolver , connection , default_manager , filterset_class , filtering_args ,
7749 root , args , context , info ):
7850 filter_kwargs = {k : v for k , v in args .items () if k in filtering_args }
79- qs = default_manager .get_queryset ()
80- qs = filterset_class (data = filter_kwargs , queryset = qs ).qs
51+ qs = filterset_class (
52+ data = filter_kwargs ,
53+ queryset = default_manager .get_queryset ()
54+ ).qs
8155 return DjangoConnectionField .connection_resolver (resolver , connection , qs , root , args , context , info )
8256
8357 def get_resolver (self , parent_resolver ):
0 commit comments