11import importlib
22import typing
3+ import warnings
34
45import django .core .checks
56from django import forms
@@ -35,6 +36,21 @@ def validate(self, value: list) -> None:
3536 self .base_field .validate (val )
3637
3738
39+ class FilterField (forms .Field ):
40+ default_error_messages = {
41+ "invalid_callable" : _ ("%(value)s is not valid callable for skipif." ),
42+ }
43+
44+ def to_python (self , value : typing .Any ) -> typing .Optional [typing .Callable ]:
45+ if not value :
46+ return None
47+ if not callable (value ):
48+ raise forms .ValidationError (
49+ self .error_messages ["invalid_callable" ], code = "invalid_callable"
50+ )
51+ return value
52+
53+
3854class UnionField (forms .Field ):
3955 default_error_messages = {
4056 "type_invalid" : _ ("%(value)s is not one of the available types." ),
@@ -176,6 +192,7 @@ class BaseCheckForm(forms.Form):
176192 required = False ,
177193 )
178194 ignore_types = ListField (forms .CharField (), required = False )
195+ skipif = FilterField (required = False )
179196
180197 def clean_level (self ) -> typing .Optional [int ]:
181198 if self .cleaned_data ["level" ]:
@@ -195,6 +212,11 @@ def clean_ignore_types(self) -> set:
195212 raise forms .ValidationError (
196213 f"ignore_types contains entry that can't be imported: '{ import_path } '."
197214 )
215+ if result :
216+ warnings .warn (
217+ "ignore_types is deprecated and will be removed in version 0.11.0, replace it with skipif option." ,
218+ FutureWarning ,
219+ )
198220 return result
199221
200222 def clean (self ) -> typing .Dict [str , typing .Any ]:
@@ -203,6 +225,8 @@ def clean(self) -> typing.Dict[str, typing.Any]:
203225 and not self .cleaned_data ["ignore_types" ]
204226 ):
205227 del self .cleaned_data ["ignore_types" ]
228+ if "skipif" in self .cleaned_data and not self .cleaned_data ["skipif" ]:
229+ del self .cleaned_data ["skipif" ]
206230 return self .cleaned_data
207231
208232
0 commit comments