diff --git a/docs/advanced.rst b/docs/advanced.rst index a2b6aa1b5..642a315a9 100644 --- a/docs/advanced.rst +++ b/docs/advanced.rst @@ -134,7 +134,7 @@ for example a confirmation field:: class ContactModelView(ModelView): datamodel = SQLAInterface(Contact) add_form_extra_fields = { - 'extra': TextField(gettext('Extra Field'), + 'extra': StringField(gettext('Extra Field'), description=gettext('Extra Field description'), widget=BS3TextFieldWidget()) } @@ -158,7 +158,7 @@ Next override your field using your new widget:: class ExampleView(ModelView): datamodel = SQLAInterface(ExampleModel) edit_form_extra_fields = { - 'field2': TextField('field2', widget=BS3TextFieldROWidget()) + 'field2': StringField('field2', widget=BS3TextFieldROWidget()) } Readonly select fields are a special case, but it's solved in a simpler way:: @@ -177,7 +177,7 @@ Readonly select fields are a special case, but it's solved in a simpler way:: edit_form_extra_fields = { 'department': QuerySelectField( 'Department', - query_factory=department_query, + query_func=department_query, widget=Select2Widget(extra_classes="readonly") ) } diff --git a/examples/employees/app/views.py b/examples/employees/app/views.py index 6a71cf950..420272d9b 100644 --- a/examples/employees/app/views.py +++ b/examples/employees/app/views.py @@ -1,7 +1,7 @@ from flask_appbuilder import ModelView +from flask_appbuilder.fields import QuerySelectField from flask_appbuilder.fieldwidgets import Select2Widget from flask_appbuilder.models.sqla.interface import SQLAInterface -from wtforms.ext.sqlalchemy.fields import QuerySelectField from . import appbuilder, db from .models import Benefit, Department, Employee, EmployeeHistory, Function @@ -24,7 +24,7 @@ class EmployeeView(ModelView): edit_form_extra_fields = { "department": QuerySelectField( "Department", - query_factory=department_query, + query_func=department_query, widget=Select2Widget(extra_classes="readonly"), ) } diff --git a/flask_appbuilder/models/mongoengine/fields.py b/flask_appbuilder/models/mongoengine/fields.py index bce85f917..bbae95301 100644 --- a/flask_appbuilder/models/mongoengine/fields.py +++ b/flask_appbuilder/models/mongoengine/fields.py @@ -24,17 +24,17 @@ class MongoFileField(fields.FileField): widget = BS3FileUploadFieldWidget() def __init__(self, label=None, validators=None, **kwargs): - super(MongoFileField, self).__init__(label, validators, **kwargs) + super().__init__(label, validators, **kwargs) self._should_delete = False - def process(self, formdata, data=unset_value): + def process(self, formdata, data=unset_value, **kwargs): if formdata: marker = "_%s-delete" % self.name if marker in formdata: self._should_delete = True - return super(MongoFileField, self).process(formdata, data) + return super().process(formdata, data, **kwargs) def populate_obj(self, obj, name): field = getattr(obj, name, None) diff --git a/flask_appbuilder/upload.py b/flask_appbuilder/upload.py index 37e9377ec..b6969075a 100644 --- a/flask_appbuilder/upload.py +++ b/flask_appbuilder/upload.py @@ -103,12 +103,12 @@ def get_url(self, field): # Fields -class FileUploadField(fields.TextField): +class FileUploadField(fields.StringField): """ Customizable file-upload field. Saves file to configured path, handles updates and deletions. - Inherits from `TextField`, resulting filename will be stored as string. + Inherits from `StringField`, resulting filename will be stored as string. """ widget = BS3FileUploadFieldWidget() @@ -126,7 +126,7 @@ def __init__(self, label=None, validators=None, filemanager=None, **kwargs): self.filemanager = filemanager or FileManager() self._should_delete = False - super(FileUploadField, self).__init__(label, validators, **kwargs) + super().__init__(label, validators, **kwargs) def process_on_delete(self, obj): """Override this method to make customised updates to the object @@ -159,12 +159,12 @@ def pre_validate(self, form): ): raise ValidationError(gettext("Invalid file extension")) - def process(self, formdata, data=unset_value): + def process(self, formdata, data=unset_value, **kwargs): if formdata: marker = "_%s-delete" % self.name if marker in formdata: self._should_delete = True - return super(FileUploadField, self).process(formdata, data) + return super().process(formdata, data, **kwargs) def populate_obj(self, obj, name): field = getattr(obj, name, None) @@ -202,7 +202,7 @@ def __init__(self, label=None, validators=None, imagemanager=None, **kwargs): self.imagemanager = imagemanager or ImageManager() self._should_delete = False - super(ImageUploadField, self).__init__(label, validators, **kwargs) + super().__init__(label, validators, **kwargs) def pre_validate(self, form): if ( @@ -212,12 +212,12 @@ def pre_validate(self, form): ): raise ValidationError(gettext("Invalid file extension")) - def process(self, formdata, data=unset_value): + def process(self, formdata, data=unset_value, **kwargs): if formdata: marker = "_%s-delete" % self.name if marker in formdata: self._should_delete = True - return super(ImageUploadField, self).process(formdata, data) + return super().process(formdata, data, **kwargs) def populate_obj(self, obj, name): field = getattr(obj, name, None) diff --git a/requirements.txt b/requirements.txt index bd420f7e4..5461a7943 100644 --- a/requirements.txt +++ b/requirements.txt @@ -1,5 +1,5 @@ # -# This file is autogenerated by pip-compile with python 3.8 +# This file is autogenerated by pip-compile with python 3.9 # To update, run: # # pip-compile @@ -36,7 +36,7 @@ flask-login==0.6.0 # via Flask-AppBuilder (setup.py) flask-sqlalchemy==2.5.1 # via Flask-AppBuilder (setup.py) -flask-wtf==0.15.1 +flask-wtf==1.0.1 # via Flask-AppBuilder (setup.py) greenlet==1.1.2 # via sqlalchemy @@ -104,7 +104,7 @@ werkzeug==2.0.3 # flask # flask-jwt-extended # flask-login -wtforms==2.3.3 +wtforms==3.0.1 # via # Flask-AppBuilder (setup.py) # flask-wtf diff --git a/setup.py b/setup.py index c87ca929a..6a19ff48c 100644 --- a/setup.py +++ b/setup.py @@ -53,7 +53,7 @@ def desc(): "Flask-Babel>=1, <3", "Flask-Login>=0.3, <0.7", "Flask-SQLAlchemy>=2.4, <3", - "Flask-WTF>=0.14.2, <1.0.0", + "Flask-WTF>=0.14.2, <2", "Flask-JWT-Extended>=4.0.0, <5.0.0", "jsonschema>=3, <5", "marshmallow>=3, <4", @@ -65,7 +65,7 @@ def desc(): # Cautious cap "SQLAlchemy<1.5", "sqlalchemy-utils>=0.32.21, <1", - "WTForms<3.0.0", + "WTForms<4", ], extras_require={ "jmespath": ["jmespath>=0.9.5"],