Commit f6894398 authored by Serge S. Koval's avatar Serge S. Koval

Additional flask-wtf cleanup fixes

parent b255126b
...@@ -5,6 +5,7 @@ from wtforms import form, fields, validators ...@@ -5,6 +5,7 @@ from wtforms import form, fields, validators
from flask.ext import admin, login from flask.ext import admin, login
from flask.ext.admin.contrib.mongoengine import ModelView from flask.ext.admin.contrib.mongoengine import ModelView
from flask.ext.admin import helpers
# Create application # Create application
app = Flask(__name__) app = Flask(__name__)
...@@ -103,7 +104,7 @@ def index(): ...@@ -103,7 +104,7 @@ def index():
@app.route('/login/', methods=('GET', 'POST')) @app.route('/login/', methods=('GET', 'POST'))
def login_view(): def login_view():
form = LoginForm(request.form) form = LoginForm(request.form)
if form.validate_on_submit(): if helpers.validate_form_on_submit(form):
user = form.get_user() user = form.get_user()
login.login_user(user) login.login_user(user)
return redirect(url_for('index')) return redirect(url_for('index'))
...@@ -114,7 +115,7 @@ def login_view(): ...@@ -114,7 +115,7 @@ def login_view():
@app.route('/register/', methods=('GET', 'POST')) @app.route('/register/', methods=('GET', 'POST'))
def register_view(): def register_view():
form = RegistrationForm(request.form) form = RegistrationForm(request.form)
if form.validate_on_submit(): if helpers.validate_form_on_submit(form):
user = User() user = User()
form.populate_obj(user) form.populate_obj(user)
......
...@@ -5,6 +5,7 @@ from wtforms import form, fields, validators ...@@ -5,6 +5,7 @@ from wtforms import form, fields, validators
from flask.ext import admin, login from flask.ext import admin, login
from flask.ext.admin.contrib import sqlamodel from flask.ext.admin.contrib import sqlamodel
from flask.ext.admin import helpers
# Create Flask application # Create Flask application
app = Flask(__name__) app = Flask(__name__)
...@@ -104,7 +105,7 @@ def index(): ...@@ -104,7 +105,7 @@ def index():
@app.route('/login/', methods=('GET', 'POST')) @app.route('/login/', methods=('GET', 'POST'))
def login_view(): def login_view():
form = LoginForm(request.form) form = LoginForm(request.form)
if form.validate_on_submit(): if helpers.validate_form_on_submit(form):
user = form.get_user() user = form.get_user()
login.login_user(user) login.login_user(user)
return redirect(url_for('index')) return redirect(url_for('index'))
...@@ -115,7 +116,7 @@ def login_view(): ...@@ -115,7 +116,7 @@ def login_view():
@app.route('/register/', methods=('GET', 'POST')) @app.route('/register/', methods=('GET', 'POST'))
def register_view(): def register_view():
form = RegistrationForm(request.form) form = RegistrationForm(request.form)
if form.validate_on_submit(): if helpers.validate_form_on_submit(form):
user = User() user = User()
form.populate_obj(user) form.populate_obj(user)
......
...@@ -106,8 +106,6 @@ class BaseView(six.with_metaclass(AdminViewMeta, BaseMeta)): ...@@ -106,8 +106,6 @@ class BaseView(six.with_metaclass(AdminViewMeta, BaseMeta)):
def index(self): def index(self):
return 'Hello World!' return 'Hello World!'
""" """
__metaclass__ = AdminViewMeta
@property @property
def _template_args(self): def _template_args(self):
""" """
......
...@@ -15,7 +15,7 @@ from wtforms import fields, validators ...@@ -15,7 +15,7 @@ from wtforms import fields, validators
from flask.ext.admin.base import BaseView, expose from flask.ext.admin.base import BaseView, expose
from flask.ext.admin.actions import action, ActionsMixin from flask.ext.admin.actions import action, ActionsMixin
from flask.ext.admin.babel import gettext, lazy_gettext from flask.ext.admin.babel import gettext, lazy_gettext
from flask.ext.admin import form from flask.ext.admin import form, helpers
class NameForm(form.BaseForm): class NameForm(form.BaseForm):
...@@ -43,7 +43,7 @@ class UploadForm(form.BaseForm): ...@@ -43,7 +43,7 @@ class UploadForm(form.BaseForm):
def __init__(self, admin): def __init__(self, admin):
self.admin = admin self.admin = admin
super(UploadForm, self).__init__() super(UploadForm, self).__init__(helpers.get_form_data())
def validate_upload(self, field): def validate_upload(self, field):
if not self.upload.has_file(): if not self.upload.has_file():
...@@ -476,7 +476,7 @@ class FileAdmin(BaseView, ActionsMixin): ...@@ -476,7 +476,7 @@ class FileAdmin(BaseView, ActionsMixin):
return redirect(self._get_dir_url('.index', path)) return redirect(self._get_dir_url('.index', path))
form = UploadForm(self) form = UploadForm(self)
if form.validate_on_submit(): if helpers.validate_form_on_submit(form):
filename = op.join(directory, filename = op.join(directory,
secure_filename(form.upload.data.filename)) secure_filename(form.upload.data.filename))
...@@ -511,9 +511,9 @@ class FileAdmin(BaseView, ActionsMixin): ...@@ -511,9 +511,9 @@ class FileAdmin(BaseView, ActionsMixin):
flash(gettext('Directory creation is disabled.'), 'error') flash(gettext('Directory creation is disabled.'), 'error')
return redirect(dir_url) return redirect(dir_url)
form = NameForm(request.form) form = NameForm(helpers.get_form_data())
if form.validate_on_submit(): if helpers.validate_form_on_submit(form):
try: try:
os.mkdir(op.join(directory, form.name.data)) os.mkdir(op.join(directory, form.name.data))
self.on_mkdir(directory, form.name.data) self.on_mkdir(directory, form.name.data)
...@@ -587,8 +587,8 @@ class FileAdmin(BaseView, ActionsMixin): ...@@ -587,8 +587,8 @@ class FileAdmin(BaseView, ActionsMixin):
flash(gettext('Path does not exist.')) flash(gettext('Path does not exist.'))
return redirect(return_url) return redirect(return_url)
form = NameForm(request.form, name=op.basename(path)) form = NameForm(helpers.get_form_data(), name=op.basename(path))
if form.validate_on_submit(): if helpers.validate_form_on_submit(form):
try: try:
dir_base = op.dirname(full_path) dir_base = op.dirname(full_path)
filename = secure_filename(form.name.data) filename = secure_filename(form.name.data)
...@@ -627,10 +627,10 @@ class FileAdmin(BaseView, ActionsMixin): ...@@ -627,10 +627,10 @@ class FileAdmin(BaseView, ActionsMixin):
dir_url = self._get_dir_url('.index', os.path.dirname(path)) dir_url = self._get_dir_url('.index', os.path.dirname(path))
next_url = next_url or dir_url next_url = next_url or dir_url
form = EditForm() form = EditForm(helpers.get_form_data())
error = False error = False
if request.method == 'POST': if helpers.validate_form_on_submit(form):
form.process(request.form, content='') form.process(request.form, content='')
if form.validate(): if form.validate():
try: try:
......
...@@ -7,30 +7,9 @@ from flask.ext.admin.babel import gettext, ngettext ...@@ -7,30 +7,9 @@ from flask.ext.admin.babel import gettext, ngettext
from flask.ext.admin import helpers as h from flask.ext.admin import helpers as h
# TODO: Use flask.ext.wtf if possible
class BaseForm(form.Form): class BaseForm(form.Form):
""" pass
Customized form class.
"""
def __init__(self, formdata=None, obj=None, prefix='', **kwargs):
if formdata:
super(BaseForm, self).__init__(formdata, obj, prefix, **kwargs)
else:
super(BaseForm, self).__init__(obj=obj, prefix=prefix, **kwargs)
self._obj = obj
@property
def has_file_field(self):
"""
Return True if form contains at least one FileField.
Does not check for child form fields.
"""
# TODO: Optimize me
for f in self:
if isinstance(f, fields.FileField):
return True
return False
class TimeField(fields.Field): class TimeField(fields.Field):
......
from flask import g from flask import g, request
from wtforms.validators import DataRequired, InputRequired from wtforms.validators import DataRequired, InputRequired
...@@ -7,11 +7,49 @@ def set_current_view(view): ...@@ -7,11 +7,49 @@ def set_current_view(view):
def get_current_view(): def get_current_view():
"""
Get current administrative view.
"""
return getattr(g, '_admin_view', None) return getattr(g, '_admin_view', None)
def is_required_form_field(field): def is_required_form_field(field):
"""
Check if form field has `DataRequired` or `InputRequired` validators.
:param field:
WTForms field to check
"""
for validator in field.validators: for validator in field.validators:
if isinstance(validator, (DataRequired, InputRequired)): if isinstance(validator, (DataRequired, InputRequired)):
return True return True
return False return False
def is_form_submitted():
"""
Check if current method is PUT or POST
"""
return request and request.method in ("PUT", "POST")
def validate_form_on_submit(form):
"""
If current method is PUT or POST, validate form and return validation status.
"""
return is_form_submitted() and form.validate()
def get_form_data():
"""
If current method is PUT or POST, return concatenated `request.form` with
`request.files` or `None` otherwise.
"""
if is_form_submitted():
formdata = request.form
if request.files:
formdata = formdata.copy()
formdata.update(request.files)
return formdata
return None
...@@ -10,6 +10,7 @@ from flask.ext.admin.base import BaseView, expose ...@@ -10,6 +10,7 @@ from flask.ext.admin.base import BaseView, expose
from flask.ext.admin.tools import rec_getattr, ObsoleteAttr from flask.ext.admin.tools import rec_getattr, ObsoleteAttr
from flask.ext.admin.model import filters, typefmt from flask.ext.admin.model import filters, typefmt
from flask.ext.admin.actions import ActionsMixin from flask.ext.admin.actions import ActionsMixin
from flask.ext.admin import get_form_data, validate_form_on_submit
class BaseModelView(BaseView, ActionsMixin): class BaseModelView(BaseView, ActionsMixin):
...@@ -607,7 +608,7 @@ class BaseModelView(BaseView, ActionsMixin): ...@@ -607,7 +608,7 @@ class BaseModelView(BaseView, ActionsMixin):
Override to implement custom behavior. Override to implement custom behavior.
""" """
return self._create_form_class(obj=obj) return self._create_form_class(get_form_data(), obj=obj)
def edit_form(self, obj=None): def edit_form(self, obj=None):
""" """
...@@ -615,7 +616,7 @@ class BaseModelView(BaseView, ActionsMixin): ...@@ -615,7 +616,7 @@ class BaseModelView(BaseView, ActionsMixin):
Override to implement custom behavior. Override to implement custom behavior.
""" """
return self._edit_form_class(obj=obj) return self._edit_form_class(get_form_data(), obj=obj)
# Helpers # Helpers
def is_sortable(self, name): def is_sortable(self, name):
...@@ -1028,7 +1029,7 @@ class BaseModelView(BaseView, ActionsMixin): ...@@ -1028,7 +1029,7 @@ class BaseModelView(BaseView, ActionsMixin):
form = self.create_form() form = self.create_form()
if form.validate_on_submit(): if validate_form_on_submit(form):
if self.create_model(form): if self.create_model(form):
if '_add_another' in request.form: if '_add_another' in request.form:
flash(gettext('Model was successfully created.')) flash(gettext('Model was successfully created.'))
...@@ -1062,7 +1063,7 @@ class BaseModelView(BaseView, ActionsMixin): ...@@ -1062,7 +1063,7 @@ class BaseModelView(BaseView, ActionsMixin):
form = self.edit_form(obj=model) form = self.edit_form(obj=model)
if form.validate_on_submit(): if validate_form_on_submit(form):
if self.update_model(form, model): if self.update_model(form, model):
return redirect(return_url) return redirect(return_url)
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment