Skip to content
Projects
Groups
Snippets
Help
Loading...
Help
Submit feedback
Sign in
Toggle navigation
F
flask-admin
Project
Project
Details
Activity
Releases
Cycle Analytics
Repository
Repository
Files
Commits
Branches
Tags
Contributors
Graph
Compare
Charts
Issues
0
Issues
0
List
Board
Labels
Milestones
JIRA
JIRA
Merge Requests
0
Merge Requests
0
Wiki
Wiki
Snippets
Snippets
Members
Members
Collapse sidebar
Close sidebar
Activity
Graph
Charts
Create a new issue
Commits
Issue Boards
Open sidebar
Python-Dev
flask-admin
Commits
d6447e8b
Commit
d6447e8b
authored
Jul 28, 2013
by
Serge S. Koval
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
Refactored form fields and widgets
parent
7264cb7d
Changes
4
Hide whitespace changes
Inline
Side-by-side
Showing
4 changed files
with
116 additions
and
103 deletions
+116
-103
__init__.py
flask_admin/form/__init__.py
+25
-0
fields.py
flask_admin/form/fields.py
+6
-103
widgets.py
flask_admin/form/widgets.py
+84
-0
admin.css
flask_admin/static/admin/css/admin.css
+1
-0
No files found.
flask_admin/form/__init__.py
0 → 100644
View file @
d6447e8b
from
wtforms
import
form
from
wtforms.fields.core
import
UnboundField
from
.fields
import
*
from
.widgets
import
*
class
BaseForm
(
form
.
Form
):
def
__init__
(
self
,
formdata
=
None
,
obj
=
None
,
prefix
=
u''
,
**
kwargs
):
self
.
_obj
=
obj
super
(
BaseForm
,
self
)
.
__init__
(
formdata
=
formdata
,
obj
=
obj
,
prefix
=
prefix
,
**
kwargs
)
def
recreate_field
(
unbound
):
"""
Create new instance of the unbound field, resetting wtforms creation counter.
:param unbound:
UnboundField instance
"""
if
not
isinstance
(
unbound
,
UnboundField
):
raise
ValueError
(
'recreate_field expects UnboundField instance,
%
s was passed.'
%
type
(
unbound
))
return
unbound
.
field_class
(
*
unbound
.
args
,
**
unbound
.
kwargs
)
flask_admin/form.py
→
flask_admin/form
/fields
.py
View file @
d6447e8b
import
time
import
datetime
from
wtforms
import
form
,
fields
,
widgets
from
wtforms.fields.core
import
UnboundField
from
flask.globals
import
_request_ctx_stack
from
flask.ext.admin.babel
import
gettext
,
ngettext
from
flask.ext.admin
import
helpers
as
h
from
wtforms
import
fields
,
widgets
from
flask.ext.admin.babel
import
gettext
from
flask.ext.admin._compat
import
text_type
from
.
import
widgets
as
admin_widgets
# TODO: Use flask.ext.wtf if possible
class
BaseForm
(
form
.
Form
):
def
__init__
(
self
,
formdata
=
None
,
obj
=
None
,
prefix
=
u''
,
**
kwargs
):
self
.
_obj
=
obj
super
(
BaseForm
,
self
)
.
__init__
(
formdata
=
formdata
,
obj
=
obj
,
prefix
=
prefix
,
**
kwargs
)
__all__
=
[
'TimeField'
,
'Select2Field'
,
'Select2TagsField'
]
class
TimeField
(
fields
.
Field
):
...
...
@@ -66,24 +59,6 @@ class TimeField(fields.Field):
raise
ValueError
(
gettext
(
'Invalid time format'
))
class
Select2Widget
(
widgets
.
Select
):
"""
`Select2 <https://github.com/ivaynberg/select2>`_ styled select widget.
You must include select2.js, form.js and select2 stylesheet for it to
work.
"""
def
__call__
(
self
,
field
,
**
kwargs
):
allow_blank
=
getattr
(
field
,
'allow_blank'
,
False
)
if
allow_blank
and
not
self
.
multiple
:
kwargs
[
'data-role'
]
=
u'select2blank'
else
:
kwargs
[
'data-role'
]
=
u'select2'
return
super
(
Select2Widget
,
self
)
.
__call__
(
field
,
**
kwargs
)
class
Select2Field
(
fields
.
SelectField
):
"""
`Select2 <https://github.com/ivaynberg/select2>`_ styled select widget.
...
...
@@ -91,7 +66,7 @@ class Select2Field(fields.SelectField):
You must include select2.js, form.js and select2 stylesheet for it to
work.
"""
widget
=
Select2Widget
()
widget
=
admin_widgets
.
Select2Widget
()
def
__init__
(
self
,
label
=
None
,
validators
=
None
,
coerce
=
text_type
,
choices
=
None
,
allow_blank
=
False
,
blank_text
=
None
,
**
kwargs
):
...
...
@@ -133,70 +108,11 @@ class Select2Field(fields.SelectField):
super
(
Select2Field
,
self
)
.
pre_validate
(
form
)
class
DatePickerWidget
(
widgets
.
TextInput
):
"""
Date picker widget.
You must include bootstrap-datepicker.js and form.js for styling to work.
"""
def
__call__
(
self
,
field
,
**
kwargs
):
kwargs
[
'data-role'
]
=
u'datepicker'
return
super
(
DatePickerWidget
,
self
)
.
__call__
(
field
,
**
kwargs
)
class
DateTimePickerWidget
(
widgets
.
TextInput
):
"""
Datetime picker widget.
You must include bootstrap-datepicker.js and form.js for styling to work.
"""
def
__call__
(
self
,
field
,
**
kwargs
):
kwargs
[
'data-role'
]
=
u'datetimepicker'
return
super
(
DateTimePickerWidget
,
self
)
.
__call__
(
field
,
**
kwargs
)
class
RenderTemplateWidget
(
object
):
"""
WTForms widget that renders Jinja2 template
"""
def
__init__
(
self
,
template
):
"""
Constructor
:param template:
Template path
"""
self
.
template
=
template
def
__call__
(
self
,
field
,
**
kwargs
):
ctx
=
_request_ctx_stack
.
top
jinja_env
=
ctx
.
app
.
jinja_env
kwargs
.
update
({
'field'
:
field
,
'_gettext'
:
gettext
,
'_ngettext'
:
ngettext
,
'h'
:
h
,
})
template
=
jinja_env
.
get_template
(
self
.
template
)
return
template
.
render
(
kwargs
)
class
Select2TagsWidget
(
widgets
.
TextInput
):
"""`Select2 <http://ivaynberg.github.com/select2/#tags>`_ styled text widget.
You must include select2.js, form.js and select2 stylesheet for it to work.
"""
def
__call__
(
self
,
field
,
**
kwargs
):
kwargs
[
'data-role'
]
=
u'select2tags'
return
super
(
Select2TagsWidget
,
self
)
.
__call__
(
field
,
**
kwargs
)
class
Select2TagsField
(
fields
.
TextField
):
"""`Select2 <http://ivaynberg.github.com/select2/#tags>`_ styled text field.
You must include select2.js, form.js and select2 stylesheet for it to work.
"""
widget
=
Select2TagsWidget
()
widget
=
admin_widgets
.
Select2TagsWidget
()
def
__init__
(
self
,
label
=
None
,
validators
=
None
,
save_as_list
=
False
,
**
kwargs
):
"""Initialization
...
...
@@ -215,16 +131,3 @@ class Select2TagsField(fields.TextField):
def
_value
(
self
):
return
u', '
.
join
(
self
.
data
)
if
isinstance
(
self
.
data
,
list
)
else
self
.
data
def
recreate_field
(
unbound
):
"""
Create new instance of the unbound field, resetting wtforms creation counter.
:param unbound:
UnboundField instance
"""
if
not
isinstance
(
unbound
,
UnboundField
):
raise
ValueError
(
'recreate_field expects UnboundField instance,
%
s was passed.'
%
type
(
unbound
))
return
unbound
.
field_class
(
*
unbound
.
args
,
**
unbound
.
kwargs
)
flask_admin/form/widgets.py
0 → 100644
View file @
d6447e8b
from
wtforms
import
widgets
from
flask.globals
import
_request_ctx_stack
from
flask.ext.admin.babel
import
gettext
,
ngettext
from
flask.ext.admin
import
helpers
as
h
__all__
=
[
'Select2Widget'
,
'DatePickerWidget'
,
'DateTimePickerWidget'
,
'RenderTemplateWidget'
,
'Select2TagsWidget'
,
]
class
Select2Widget
(
widgets
.
Select
):
"""
`Select2 <https://github.com/ivaynberg/select2>`_ styled select widget.
You must include select2.js, form.js and select2 stylesheet for it to
work.
"""
def
__call__
(
self
,
field
,
**
kwargs
):
allow_blank
=
getattr
(
field
,
'allow_blank'
,
False
)
if
allow_blank
and
not
self
.
multiple
:
kwargs
[
'data-role'
]
=
u'select2blank'
else
:
kwargs
[
'data-role'
]
=
u'select2'
return
super
(
Select2Widget
,
self
)
.
__call__
(
field
,
**
kwargs
)
class
DatePickerWidget
(
widgets
.
TextInput
):
"""
Date picker widget.
You must include bootstrap-datepicker.js and form.js for styling to work.
"""
def
__call__
(
self
,
field
,
**
kwargs
):
kwargs
[
'data-role'
]
=
u'datepicker'
return
super
(
DatePickerWidget
,
self
)
.
__call__
(
field
,
**
kwargs
)
class
DateTimePickerWidget
(
widgets
.
TextInput
):
"""
Datetime picker widget.
You must include bootstrap-datepicker.js and form.js for styling to work.
"""
def
__call__
(
self
,
field
,
**
kwargs
):
kwargs
[
'data-role'
]
=
u'datetimepicker'
return
super
(
DateTimePickerWidget
,
self
)
.
__call__
(
field
,
**
kwargs
)
class
RenderTemplateWidget
(
object
):
"""
WTForms widget that renders Jinja2 template
"""
def
__init__
(
self
,
template
):
"""
Constructor
:param template:
Template path
"""
self
.
template
=
template
def
__call__
(
self
,
field
,
**
kwargs
):
ctx
=
_request_ctx_stack
.
top
jinja_env
=
ctx
.
app
.
jinja_env
kwargs
.
update
({
'field'
:
field
,
'_gettext'
:
gettext
,
'_ngettext'
:
ngettext
,
'h'
:
h
,
})
template
=
jinja_env
.
get_template
(
self
.
template
)
return
template
.
render
(
kwargs
)
class
Select2TagsWidget
(
widgets
.
TextInput
):
"""`Select2 <http://ivaynberg.github.com/select2/#tags>`_ styled text widget.
You must include select2.js, form.js and select2 stylesheet for it to work.
"""
def
__call__
(
self
,
field
,
**
kwargs
):
kwargs
[
'data-role'
]
=
u'select2tags'
return
super
(
Select2TagsWidget
,
self
)
.
__call__
(
field
,
**
kwargs
)
flask_admin/static/admin/css/admin.css
View file @
d6447e8b
...
...
@@ -19,6 +19,7 @@ form.icon button {
a
.icon
{
text-decoration
:
none
;
color
:
black
;
}
/* Model search form */
...
...
Write
Preview
Markdown
is supported
0%
Try again
or
attach a new file
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment