1
- from collections .abc import Callable
1
+ from collections .abc import Callable , Iterable
2
2
from typing import Any
3
3
4
4
from django import forms
5
5
from django .db .models import Q , QuerySet
6
6
from django .forms import Field
7
+ from django_stubs_ext import StrOrPromise
7
8
8
9
from .fields import (
9
10
BaseCSVField ,
@@ -12,6 +13,7 @@ from .fields import (
12
13
DateTimeRangeField ,
13
14
IsoDateTimeField ,
14
15
IsoDateTimeRangeField ,
16
+ Lookup ,
15
17
LookupChoiceField ,
16
18
ModelChoiceField ,
17
19
ModelMultipleChoiceField ,
@@ -65,15 +67,15 @@ class Filter:
65
67
field_name : str | None = None ,
66
68
lookup_expr : str | None = None ,
67
69
* ,
68
- label : str | None = None ,
70
+ label : StrOrPromise | None = None ,
69
71
method : Callable [..., Any ] | str | None = None , # Filter methods can return various types
70
72
distinct : bool = False ,
71
73
exclude : bool = False ,
72
74
** kwargs : Any , # Field kwargs stored as extra (required, help_text, etc.)
73
75
) -> None : ...
74
76
def get_method (self , qs : QuerySet [Any ]) -> Callable [..., QuerySet [Any ]]: ... # Returns QuerySet filtering methods
75
77
method : Callable [..., Any ] | str | None # Custom filter methods return various types
76
- label : str | None # Filter label for display
78
+ label : StrOrPromise | None # Filter label for display
77
79
@property
78
80
def field (self ) -> Field : ...
79
81
def filter (self , qs : QuerySet [Any ], value : Any ) -> QuerySet [Any ]: ... # Filter value can be any user input type
@@ -87,7 +89,19 @@ class BooleanFilter(Filter):
87
89
class ChoiceFilter (Filter ):
88
90
field_class : type [Any ] # Base class for choice-based filters
89
91
null_value : Any # Null value can be any type (None, empty string, etc.)
90
- def __init__ (self , * args : Any , ** kwargs : Any ) -> None : ... # Uses kwargs for null_value config
92
+ def __init__ (
93
+ self ,
94
+ field_name : str | None = None ,
95
+ lookup_expr : str | None = None ,
96
+ * ,
97
+ null_value : Any = ..., # Null value can be any type (None, empty string, etc.)
98
+ # Inherited from Filter
99
+ label : StrOrPromise | None = None ,
100
+ method : Callable [..., Any ] | str | None = None , # Filter methods can return various types
101
+ distinct : bool = False ,
102
+ exclude : bool = False ,
103
+ ** kwargs : Any , # Field kwargs stored as extra (required, help_text, etc.)
104
+ ) -> None : ...
91
105
def filter (self , qs : QuerySet [Any ], value : Any ) -> QuerySet [Any ]: ...
92
106
93
107
class TypedChoiceFilter (Filter ):
@@ -101,7 +115,20 @@ class MultipleChoiceFilter(Filter):
101
115
always_filter : bool
102
116
conjoined : bool
103
117
null_value : Any # Multiple choice null values vary by implementation
104
- def __init__ (self , * args : Any , ** kwargs : Any ) -> None : ... # Uses kwargs for distinct, conjoined, null_value config
118
+ def __init__ (
119
+ self ,
120
+ field_name : str | None = None ,
121
+ lookup_expr : str | None = None ,
122
+ * ,
123
+ distinct : bool = True , # Overrides distinct default
124
+ conjoined : bool = False ,
125
+ null_value : Any = ..., # Multiple choice null values vary by implementation
126
+ # Inherited from Filter
127
+ label : StrOrPromise | None = None ,
128
+ method : Callable [..., Any ] | str | None = None , # Filter methods can return various types
129
+ exclude : bool = False ,
130
+ ** kwargs : Any , # Field kwargs stored as extra (required, help_text, etc.)
131
+ ) -> None : ...
105
132
def is_noop (self , qs : QuerySet [Any ], value : Any ) -> bool : ... # Value can be any filter input
106
133
def filter (self , qs : QuerySet [Any ], value : Any ) -> QuerySet [Any ]: ...
107
134
def get_filter_predicate (self , v : Any ) -> Q : ... # Predicate value can be any filter input type
@@ -126,18 +153,50 @@ class DurationFilter(Filter):
126
153
127
154
class QuerySetRequestMixin :
128
155
queryset : QuerySet [Any ] | None
129
- def __init__ (self , * args : Any , ** kwargs : Any ) -> None : ... # Uses kwargs for queryset config
156
+ def __init__ (self , * , queryset : QuerySet [ Any ] | None ) -> None : ...
130
157
def get_request (self ) -> Any : ... # Request can be HttpRequest or other request types
131
158
def get_queryset (self , request : Any ) -> QuerySet [Any ]: ... # Request parameter accepts various request types
132
159
@property
133
160
def field (self ) -> Field : ...
134
161
135
162
class ModelChoiceFilter (QuerySetRequestMixin , ChoiceFilter ):
136
163
field_class : type [ModelChoiceField ] # More specific than parent ChoiceField
137
- def __init__ (self , * args : Any , ** kwargs : Any ) -> None : ... # Uses kwargs for empty_label config
164
+ def __init__ (
165
+ self ,
166
+ field_name : str | None = None ,
167
+ lookup_expr : str | None = None ,
168
+ * ,
169
+ # Inherited from QuerySetRequestMixin
170
+ queryset : QuerySet [Any ] | None = None ,
171
+ # Inherited from ChoiceFilter
172
+ null_value : Any = ..., # Null value can be any type (None, empty string, etc.)
173
+ # Inherited from Filter
174
+ label : StrOrPromise | None = None ,
175
+ method : Callable [..., Any ] | str | None = None , # Filter methods can return various types
176
+ distinct : bool = False ,
177
+ exclude : bool = False ,
178
+ ** kwargs : Any , # Field kwargs stored as extra (required, help_text, etc.)
179
+ ) -> None : ...
138
180
139
181
class ModelMultipleChoiceFilter (QuerySetRequestMixin , MultipleChoiceFilter ):
140
182
field_class : type [ModelMultipleChoiceField ] # More specific than parent MultipleChoiceField
183
+ def __init__ (
184
+ self ,
185
+ field_name : str | None = None ,
186
+ lookup_expr : str | None = None ,
187
+ * ,
188
+ # Inherited from QuerySetRequestMixin
189
+ queryset : QuerySet [Any ] | None = None ,
190
+ # Inherited from MultipleChoiceFilter
191
+ distinct : bool = True , # Overrides distinct default
192
+ conjoined : bool = False ,
193
+ null_value : Any = ..., # Multiple choice null values vary by implementation
194
+ # Inherited from Filter
195
+ label : StrOrPromise | None = None ,
196
+ method : Callable [..., Any ] | str | None = None , # Filter methods can return various types
197
+ exclude : bool = False ,
198
+ ** kwargs : Any , # Field kwargs stored as extra (required, help_text, etc.)
199
+ ) -> None : ...
141
200
142
201
class NumberFilter (Filter ):
143
202
field_class : type [forms .DecimalField ]
@@ -159,7 +218,20 @@ class DateRangeFilter(ChoiceFilter):
159
218
choices : list [tuple [str , str ]] | None
160
219
filters : dict [str , Filter ] | None
161
220
def __init__ (
162
- self , choices : list [tuple [str , str ]] | None = None , filters : dict [str , Filter ] | None = None , * args : Any , ** kwargs : Any
221
+ self ,
222
+ choices : list [tuple [str , str ]] | None = None ,
223
+ filters : dict [str , Filter ] | None = None ,
224
+ field_name : str | None = None ,
225
+ lookup_expr : str | None = None ,
226
+ * ,
227
+ # Inherited from ChoiceFilter
228
+ null_value : Any = ..., # Null value can be any type (None, empty string, etc.)
229
+ # Inherited from Filter
230
+ label : StrOrPromise | None = None ,
231
+ method : Callable [..., Any ] | str | None = None , # Filter methods can return various types
232
+ distinct : bool = False ,
233
+ exclude : bool = False ,
234
+ ** kwargs : Any , # Field kwargs stored as extra (required, help_text, etc.)
163
235
) -> None : ... # Uses args/kwargs for choice and filter configuration
164
236
def filter (self , qs : QuerySet [Any ], value : Any ) -> QuerySet [Any ]: ...
165
237
@@ -186,45 +258,64 @@ class AllValuesMultipleFilter(MultipleChoiceFilter):
186
258
class BaseCSVFilter (Filter ):
187
259
base_field_class : type [BaseCSVField ] = ...
188
260
field_class : type [Any ] # Base class for CSV-based filters
189
- def __init__ (self , * args : Any , ** kwargs : Any ) -> None : ... # Uses kwargs for help_text and widget config
190
261
191
- class BaseInFilter (BaseCSVFilter ):
192
- def __init__ (self , * args : Any , ** kwargs : Any ) -> None : ... # Sets lookup_expr and passes through
262
+ class BaseInFilter (BaseCSVFilter ): ...
193
263
194
264
class BaseRangeFilter (BaseCSVFilter ):
195
265
base_field_class : type [BaseRangeField ] = ...
196
- def __init__ (self , * args : Any , ** kwargs : Any ) -> None : ... # Sets lookup_expr and passes through
197
266
198
267
class LookupChoiceFilter (Filter ):
199
268
field_class : type [forms .CharField ]
200
269
outer_class : type [LookupChoiceField ] = ...
201
- empty_label : str | None
202
- lookup_choices : list [tuple [str , str ]] | None
270
+ empty_label : StrOrPromise | None
271
+ lookup_choices : list [tuple [str , StrOrPromise ]] | None
203
272
def __init__ (
204
273
self ,
205
274
field_name : str | None = None ,
206
- lookup_choices : list [tuple [str , str ]] | None = None ,
275
+ lookup_choices : list [tuple [str , StrOrPromise ]] | None = None ,
207
276
field_class : type [Field ] | None = None ,
208
- ** kwargs : Any , # Handles empty_label and other field config
277
+ * ,
278
+ empty_label : StrOrPromise = ...,
279
+ # Inherited from Filter
280
+ label : StrOrPromise | None = None ,
281
+ method : Callable [..., Any ] | str | None = None , # Filter methods can return various types
282
+ distinct : bool = False ,
283
+ exclude : bool = False ,
284
+ ** kwargs : Any , # Field kwargs stored as extra (required, help_text, etc.)
209
285
) -> None : ...
210
286
@classmethod
211
- def normalize_lookup (cls , lookup : Any ) -> tuple [Any , str ]: ...
212
- def get_lookup_choices (self ) -> list [tuple [str , str ]]: ...
287
+ def normalize_lookup (cls , lookup : str | tuple [ str , StrOrPromise ] ) -> tuple [str , StrOrPromise ]: ...
288
+ def get_lookup_choices (self ) -> list [tuple [str , StrOrPromise ]]: ...
213
289
@property
214
290
def field (self ) -> Field : ...
215
291
lookup_expr : str
216
- def filter (self , qs : QuerySet [Any ], lookup : Any ) -> QuerySet [Any ]: ...
292
+ def filter (self , qs : QuerySet [Any ], lookup : Lookup ) -> QuerySet [Any ]: ...
217
293
218
294
class OrderingFilter (BaseCSVFilter , ChoiceFilter ):
219
295
field_class : type [BaseCSVField ] # Inherits CSV field behavior for comma-separated ordering
220
296
descending_fmt : str
221
297
param_map : dict [str , str ] | None
222
- def __init__ (self , * args : Any , ** kwargs : Any ) -> None : ... # Uses kwargs for fields and field_labels config
298
+ def __init__ (
299
+ self ,
300
+ field_name : str | None = None ,
301
+ lookup_expr : str | None = None ,
302
+ * ,
303
+ fields : dict [str , str ] | Iterable [tuple [str , str ]] = ...,
304
+ field_labels : dict [str , StrOrPromise ] = ...,
305
+ # Inherited from ChoiceFilter
306
+ null_value : Any = ..., # Null value can be any type (None, empty string, etc.)
307
+ # Inherited from Filter
308
+ label : StrOrPromise | None = None ,
309
+ method : Callable [..., Any ] | str | None = None , # Filter methods can return various types
310
+ distinct : bool = False ,
311
+ exclude : bool = False ,
312
+ ** kwargs : Any , # Field kwargs stored as extra (required, help_text, etc.)
313
+ ) -> None : ...
223
314
def get_ordering_value (self , param : str ) -> str : ...
224
315
def filter (self , qs : QuerySet [Any ], value : Any ) -> QuerySet [Any ]: ...
225
316
@classmethod
226
317
def normalize_fields (cls , fields : Any ) -> list [str ]: ...
227
- def build_choices (self , fields : Any , labels : dict [str , str ] | None ) -> list [tuple [str , str ]]: ...
318
+ def build_choices (self , fields : Any , labels : dict [str , StrOrPromise ] | None ) -> list [tuple [str , str ]]: ...
228
319
229
320
class FilterMethod :
230
321
f : Filter
0 commit comments