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
55de42a7
Commit
55de42a7
authored
Aug 27, 2013
by
Serge S. Koval
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
New ajax refs configuration format for mongoengine/peewee backends
parent
ce5b36ef
Changes
8
Hide whitespace changes
Inline
Side-by-side
Showing
8 changed files
with
73 additions
and
50 deletions
+73
-50
ajax.py
flask_admin/contrib/mongoengine/ajax.py
+28
-20
view.py
flask_admin/contrib/mongoengine/view.py
+2
-2
ajax.py
flask_admin/contrib/peewee/ajax.py
+28
-19
view.py
flask_admin/contrib/peewee/view.py
+3
-3
ajax.py
flask_admin/contrib/sqla/ajax.py
+2
-2
base.py
flask_admin/model/base.py
+1
-1
test_basic.py
flask_admin/tests/mongoengine/test_basic.py
+6
-2
test_basic.py
flask_admin/tests/peeweemodel/test_basic.py
+3
-1
No files found.
flask_admin/contrib/mongoengine/ajax.py
View file @
55de42a7
...
...
@@ -5,17 +5,38 @@ from flask.ext.admin.model.ajax import AjaxModelLoader, DEFAULT_PAGE_SIZE
class
QueryAjaxModelLoader
(
AjaxModelLoader
):
def
__init__
(
self
,
name
,
model
,
field
s
):
def
__init__
(
self
,
name
,
model
,
**
option
s
):
"""
Constructor.
:param fields:
Fields to run query against
"""
super
(
QueryAjaxModelLoader
,
self
)
.
__init__
(
name
)
super
(
QueryAjaxModelLoader
,
self
)
.
__init__
(
name
,
options
)
self
.
model
=
model
self
.
fields
=
fields
self
.
fields
=
options
.
get
(
'fields'
)
self
.
_cached_fields
=
self
.
_process_fields
()
if
not
self
.
fields
:
raise
ValueError
(
'AJAX loading requires `fields` to be specified for
%
s.
%
s'
%
(
model
,
self
.
name
))
def
_process_fields
(
self
):
remote_fields
=
[]
for
field
in
self
.
fields
:
if
isinstance
(
field
,
string_types
):
attr
=
getattr
(
self
.
model
,
field
,
None
)
if
not
attr
:
raise
ValueError
(
'
%
s.
%
s does not exist.'
%
(
self
.
model
,
field
))
remote_fields
.
append
(
attr
)
else
:
remote_fields
.
append
(
field
)
return
remote_fields
def
format
(
self
,
model
):
if
not
model
:
...
...
@@ -31,7 +52,7 @@ class QueryAjaxModelLoader(AjaxModelLoader):
criteria
=
None
for
field
in
self
.
fields
:
for
field
in
self
.
_cached_
fields
:
flt
=
{
u'
%
s__icontains'
%
field
.
name
:
term
}
if
not
criteria
:
...
...
@@ -47,7 +68,7 @@ class QueryAjaxModelLoader(AjaxModelLoader):
return
query
.
limit
(
limit
)
.
all
()
def
create_ajax_loader
(
model
,
name
,
field_name
,
field
s
):
def
create_ajax_loader
(
model
,
name
,
field_name
,
opt
s
):
prop
=
getattr
(
model
,
field_name
,
None
)
if
prop
is
None
:
...
...
@@ -56,20 +77,7 @@ def create_ajax_loader(model, name, field_name, fields):
# TODO: Check for field
remote_model
=
prop
.
document_type
remote_fields
=
[]
for
field
in
fields
:
if
isinstance
(
field
,
string_types
):
attr
=
getattr
(
remote_model
,
field
,
None
)
if
not
attr
:
raise
ValueError
(
'
%
s.
%
s does not exist.'
%
(
remote_model
,
field
))
remote_fields
.
append
(
attr
)
else
:
remote_fields
.
append
(
field
)
return
QueryAjaxModelLoader
(
name
,
remote_model
,
remote_fields
)
return
QueryAjaxModelLoader
(
name
,
remote_model
,
**
opts
)
def
process_ajax_references
(
references
,
view
):
...
...
@@ -95,7 +103,7 @@ def process_ajax_references(references, view):
for
field_name
,
opts
in
iteritems
(
ajax_refs
):
child_name
=
make_name
(
base
,
field_name
)
if
isinstance
(
opts
,
(
list
,
tuple
)
):
if
isinstance
(
opts
,
dict
):
loader
=
create_ajax_loader
(
field
.
document_type_obj
,
child_name
,
field_name
,
opts
)
else
:
loader
=
opts
...
...
flask_admin/contrib/mongoengine/view.py
View file @
55de42a7
...
...
@@ -364,8 +364,8 @@ class ModelView(BaseModelView):
return
form_class
# AJAX foreignkey support
def
_create_ajax_loader
(
self
,
name
,
field
s
):
return
create_ajax_loader
(
self
.
model
,
name
,
name
,
field
s
)
def
_create_ajax_loader
(
self
,
name
,
opt
s
):
return
create_ajax_loader
(
self
.
model
,
name
,
name
,
opt
s
)
def
get_query
(
self
):
"""
...
...
flask_admin/contrib/peewee/ajax.py
View file @
55de42a7
...
...
@@ -5,19 +5,41 @@ from .tools import get_primary_key
class
QueryAjaxModelLoader
(
AjaxModelLoader
):
def
__init__
(
self
,
name
,
model
,
field
s
):
def
__init__
(
self
,
name
,
model
,
**
option
s
):
"""
Constructor.
:param fields:
Fields to run query against
"""
super
(
QueryAjaxModelLoader
,
self
)
.
__init__
(
name
)
super
(
QueryAjaxModelLoader
,
self
)
.
__init__
(
name
,
options
)
self
.
model
=
model
self
.
fields
=
fields
self
.
fields
=
options
.
get
(
'fields'
)
if
not
self
.
fields
:
raise
ValueError
(
'AJAX loading requires `fields` to be specified for
%
s.
%
s'
%
(
model
,
self
.
name
))
self
.
_cached_fields
=
self
.
_process_fields
()
self
.
pk
=
get_primary_key
(
model
)
def
_process_fields
(
self
):
remote_fields
=
[]
for
field
in
self
.
fields
:
if
isinstance
(
field
,
string_types
):
attr
=
getattr
(
self
.
model
,
field
,
None
)
if
not
attr
:
raise
ValueError
(
'
%
s.
%
s does not exist.'
%
(
self
.
model
,
field
))
remote_fields
.
append
(
attr
)
else
:
remote_fields
.
append
(
field
)
return
remote_fields
def
format
(
self
,
model
):
if
not
model
:
return
None
...
...
@@ -31,7 +53,7 @@ class QueryAjaxModelLoader(AjaxModelLoader):
query
=
self
.
model
.
select
()
stmt
=
None
for
field
in
self
.
fields
:
for
field
in
self
.
_cached_
fields
:
q
=
field
**
(
u'
%%%
s
%%
'
%
term
)
if
stmt
is
None
:
...
...
@@ -47,7 +69,7 @@ class QueryAjaxModelLoader(AjaxModelLoader):
return
list
(
query
.
limit
(
limit
)
.
execute
())
def
create_ajax_loader
(
model
,
name
,
field_name
,
field
s
):
def
create_ajax_loader
(
model
,
name
,
field_name
,
option
s
):
prop
=
getattr
(
model
,
field_name
,
None
)
if
prop
is
None
:
...
...
@@ -55,17 +77,4 @@ def create_ajax_loader(model, name, field_name, fields):
# TODO: Check for field
remote_model
=
prop
.
rel_model
remote_fields
=
[]
for
field
in
fields
:
if
isinstance
(
field
,
string_types
):
attr
=
getattr
(
remote_model
,
field
,
None
)
if
not
attr
:
raise
ValueError
(
'
%
s.
%
s does not exist.'
%
(
remote_model
,
field
))
remote_fields
.
append
(
attr
)
else
:
remote_fields
.
append
(
field
)
return
QueryAjaxModelLoader
(
name
,
remote_model
,
remote_fields
)
return
QueryAjaxModelLoader
(
name
,
remote_model
,
**
options
)
flask_admin/contrib/peewee/view.py
View file @
55de42a7
...
...
@@ -13,7 +13,7 @@ from flask.ext.admin.contrib.peewee import filters
from
.form
import
get_form
,
CustomModelConverter
,
InlineModelConverter
,
save_inline
from
.tools
import
get_primary_key
,
parse_like_term
from
.ajax
import
QueryAjaxModelLoader
,
create_ajax_loader
from
.ajax
import
create_ajax_loader
class
ModelView
(
BaseModelView
):
...
...
@@ -243,8 +243,8 @@ class ModelView(BaseModelView):
return
form_class
# AJAX foreignkey support
def
_create_ajax_loader
(
self
,
name
,
field
s
):
return
create_ajax_loader
(
self
.
model
,
name
,
name
,
field
s
)
def
_create_ajax_loader
(
self
,
name
,
option
s
):
return
create_ajax_loader
(
self
.
model
,
name
,
name
,
option
s
)
def
_handle_join
(
self
,
query
,
field
,
joins
):
if
field
.
model_class
!=
self
.
model
:
...
...
flask_admin/contrib/sqla/ajax.py
View file @
55de42a7
...
...
@@ -5,7 +5,7 @@ from flask.ext.admin.model.ajax import AjaxModelLoader, DEFAULT_PAGE_SIZE
class
QueryAjaxModelLoader
(
AjaxModelLoader
):
def
__init__
(
self
,
name
,
session
,
model
,
options
):
def
__init__
(
self
,
name
,
session
,
model
,
**
options
):
"""
Constructor.
...
...
@@ -74,4 +74,4 @@ def create_ajax_loader(model, session, name, field_name, options):
raise
ValueError
(
'
%
s.
%
s is not a relation.'
%
(
model
,
field_name
))
remote_model
=
attr
.
prop
.
mapper
.
class_
return
QueryAjaxModelLoader
(
name
,
session
,
remote_model
,
options
)
return
QueryAjaxModelLoader
(
name
,
session
,
remote_model
,
**
options
)
flask_admin/model/base.py
View file @
55de42a7
...
...
@@ -384,7 +384,7 @@ class BaseModelView(BaseView, ActionsMixin):
class MyModelView(BaseModelView):
form_ajax_refs = {
'user': QueryAjaxModelLoader('user', db.session, User, page_size=10)
'user': QueryAjaxModelLoader('user', db.session, User,
fields=['email'],
page_size=10)
}
If you need custom loading functionality, you can implement your custom loading behavior
...
...
flask_admin/tests/mongoengine/test_basic.py
View file @
55de42a7
...
...
@@ -375,7 +375,9 @@ def test_ajax_fk():
Model2
,
url
=
'view'
,
form_ajax_refs
=
{
'model1'
:
(
'test1'
,
'test2'
)
'model1'
:
{
'fields'
:
(
'test1'
,
'test2'
)
}
}
)
admin
.
add_view
(
view
)
...
...
@@ -448,7 +450,9 @@ def test_nested_ajax_refs():
form_subdocuments
=
{
'nested'
:
{
'form_ajax_refs'
:
{
'comment'
:
[
'name'
]
'comment'
:
{
'fields'
:
[
'name'
]
}
}
}
}
...
...
flask_admin/tests/peeweemodel/test_basic.py
View file @
55de42a7
...
...
@@ -220,7 +220,9 @@ def test_ajax_fk():
Model2
,
url
=
'view'
,
form_ajax_refs
=
{
'model1'
:
(
'test1'
,
'test2'
)
'model1'
:
{
'fields'
:
(
'test1'
,
'test2'
)
}
}
)
admin
.
add_view
(
view
)
...
...
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