1
- import inspect
2
-
3
1
from collections import OrderedDict
4
2
from functools import partial
5
3
4
+ # from graphene.relay import is_node
6
5
from graphene .types .argument import to_arguments
7
6
from ..fields import DjangoConnectionField
8
- from graphene .relay import is_node
9
7
from .utils import get_filtering_args_from_filterset , get_filterset_class
10
8
11
9
@@ -15,47 +13,12 @@ def __init__(self, type, fields=None, order_by=None,
15
13
extra_filter_meta = None , filterset_class = None ,
16
14
* args , ** kwargs ):
17
15
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
20
18
self ._extra_filter_meta = extra_filter_meta
21
19
self ._base_args = None
22
20
super (DjangoFilterConnectionField , self ).__init__ (type , * args , ** kwargs )
23
21
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
-
59
22
@property
60
23
def args (self ):
61
24
return to_arguments (self ._base_args or OrderedDict (), self .filtering_args )
@@ -66,7 +29,16 @@ def args(self, args):
66
29
67
30
@property
68
31
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
70
42
71
43
@property
72
44
def filtering_args (self ):
@@ -76,8 +48,10 @@ def filtering_args(self):
76
48
def connection_resolver (resolver , connection , default_manager , filterset_class , filtering_args ,
77
49
root , args , context , info ):
78
50
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
81
55
return DjangoConnectionField .connection_resolver (resolver , connection , qs , root , args , context , info )
82
56
83
57
def get_resolver (self , parent_resolver ):
0 commit comments