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
from flask.ext import admin, login
from flask.ext.admin.contrib.mongoengine import ModelView
from flask.ext.admin import helpers
# Create application
app = Flask(__name__)
......@@ -103,7 +104,7 @@ def index():
@app.route('/login/', methods=('GET', 'POST'))
def login_view():
form = LoginForm(request.form)
if form.validate_on_submit():
if helpers.validate_form_on_submit(form):
user = form.get_user()
login.login_user(user)
return redirect(url_for('index'))
......@@ -114,7 +115,7 @@ def login_view():
@app.route('/register/', methods=('GET', 'POST'))
def register_view():
form = RegistrationForm(request.form)
if form.validate_on_submit():
if helpers.validate_form_on_submit(form):
user = User()
form.populate_obj(user)
......
......@@ -5,6 +5,7 @@ from wtforms import form, fields, validators
from flask.ext import admin, login
from flask.ext.admin.contrib import sqlamodel
from flask.ext.admin import helpers
# Create Flask application
app = Flask(__name__)
......@@ -104,7 +105,7 @@ def index():
@app.route('/login/', methods=('GET', 'POST'))
def login_view():
form = LoginForm(request.form)
if form.validate_on_submit():
if helpers.validate_form_on_submit(form):
user = form.get_user()
login.login_user(user)
return redirect(url_for('index'))
......@@ -115,7 +116,7 @@ def login_view():
@app.route('/register/', methods=('GET', 'POST'))
def register_view():
form = RegistrationForm(request.form)
if form.validate_on_submit():
if helpers.validate_form_on_submit(form):
user = User()
form.populate_obj(user)
......
......@@ -106,8 +106,6 @@ class BaseView(six.with_metaclass(AdminViewMeta, BaseMeta)):
def index(self):
return 'Hello World!'
"""
__metaclass__ = AdminViewMeta
@property
def _template_args(self):
"""
......
......@@ -15,7 +15,7 @@ from wtforms import fields, validators
from flask.ext.admin.base import BaseView, expose
from flask.ext.admin.actions import action, ActionsMixin
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):
......@@ -43,7 +43,7 @@ class UploadForm(form.BaseForm):
def __init__(self, admin):
self.admin = admin
super(UploadForm, self).__init__()
super(UploadForm, self).__init__(helpers.get_form_data())
def validate_upload(self, field):
if not self.upload.has_file():
......@@ -476,7 +476,7 @@ class FileAdmin(BaseView, ActionsMixin):
return redirect(self._get_dir_url('.index', path))
form = UploadForm(self)
if form.validate_on_submit():
if helpers.validate_form_on_submit(form):
filename = op.join(directory,
secure_filename(form.upload.data.filename))
......@@ -511,9 +511,9 @@ class FileAdmin(BaseView, ActionsMixin):
flash(gettext('Directory creation is disabled.'), 'error')
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:
os.mkdir(op.join(directory, form.name.data))
self.on_mkdir(directory, form.name.data)
......@@ -587,8 +587,8 @@ class FileAdmin(BaseView, ActionsMixin):
flash(gettext('Path does not exist.'))
return redirect(return_url)
form = NameForm(request.form, name=op.basename(path))
if form.validate_on_submit():
form = NameForm(helpers.get_form_data(), name=op.basename(path))
if helpers.validate_form_on_submit(form):
try:
dir_base = op.dirname(full_path)
filename = secure_filename(form.name.data)
......@@ -627,10 +627,10 @@ class FileAdmin(BaseView, ActionsMixin):
dir_url = self._get_dir_url('.index', os.path.dirname(path))
next_url = next_url or dir_url
form = EditForm()
form = EditForm(helpers.get_form_data())
error = False
if request.method == 'POST':
if helpers.validate_form_on_submit(form):
form.process(request.form, content='')
if form.validate():
try:
......
......@@ -7,30 +7,9 @@ from flask.ext.admin.babel import gettext, ngettext
from flask.ext.admin import helpers as h
# TODO: Use flask.ext.wtf if possible
class BaseForm(form.Form):
"""
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
pass
class TimeField(fields.Field):
......
from flask import g
from flask import g, request
from wtforms.validators import DataRequired, InputRequired
......@@ -7,11 +7,49 @@ def set_current_view(view):
def get_current_view():
"""
Get current administrative view.
"""
return getattr(g, '_admin_view', None)
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:
if isinstance(validator, (DataRequired, InputRequired)):
return True
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
from flask.ext.admin.tools import rec_getattr, ObsoleteAttr
from flask.ext.admin.model import filters, typefmt
from flask.ext.admin.actions import ActionsMixin
from flask.ext.admin import get_form_data, validate_form_on_submit
class BaseModelView(BaseView, ActionsMixin):
......@@ -607,7 +608,7 @@ class BaseModelView(BaseView, ActionsMixin):
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):
"""
......@@ -615,7 +616,7 @@ class BaseModelView(BaseView, ActionsMixin):
Override to implement custom behavior.
"""
return self._edit_form_class(obj=obj)
return self._edit_form_class(get_form_data(), obj=obj)
# Helpers
def is_sortable(self, name):
......@@ -1028,7 +1029,7 @@ class BaseModelView(BaseView, ActionsMixin):
form = self.create_form()
if form.validate_on_submit():
if validate_form_on_submit(form):
if self.create_model(form):
if '_add_another' in request.form:
flash(gettext('Model was successfully created.'))
......@@ -1062,7 +1063,7 @@ class BaseModelView(BaseView, ActionsMixin):
form = self.edit_form(obj=model)
if form.validate_on_submit():
if validate_form_on_submit(form):
if self.update_model(form, model):
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