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
9236dd87
Commit
9236dd87
authored
Aug 27, 2013
by
Serge S. Koval
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
AJAX FK support in inline Peewee models
parent
0c2f226a
Changes
4
Show whitespace changes
Inline
Side-by-side
Showing
4 changed files
with
52 additions
and
27 deletions
+52
-27
ajax.py
flask_admin/contrib/peewee/ajax.py
+25
-3
form.py
flask_admin/contrib/peewee/form.py
+25
-1
view.py
flask_admin/contrib/peewee/view.py
+2
-22
form.py
flask_admin/contrib/sqla/form.py
+0
-1
No files found.
flask_admin/contrib/peewee/ajax.py
View file @
9236dd87
import
mongoengine
from
flask.ext.admin._compat
import
as_unicode
,
string_types
from
flask.ext.admin._compat
import
as_unicode
from
flask.ext.admin.model.ajax
import
AjaxModelLoader
,
DEFAULT_PAGE_SIZE
from
flask.ext.admin.model.ajax
import
AjaxModelLoader
,
DEFAULT_PAGE_SIZE
from
.tools
import
get_primary_key
from
.tools
import
get_primary_key
...
@@ -47,3 +45,27 @@ class QueryAjaxModelLoader(AjaxModelLoader):
...
@@ -47,3 +45,27 @@ class QueryAjaxModelLoader(AjaxModelLoader):
query
=
query
.
offset
(
offset
)
query
=
query
.
offset
(
offset
)
return
list
(
query
.
limit
(
limit
)
.
execute
())
return
list
(
query
.
limit
(
limit
)
.
execute
())
def
create_ajax_loader
(
model
,
name
,
field_name
,
fields
):
prop
=
getattr
(
model
,
field_name
,
None
)
if
prop
is
None
:
raise
ValueError
(
'Model
%
s does not have field
%
s.'
%
(
model
,
field_name
))
# 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
)
flask_admin/contrib/peewee/form.py
View file @
9236dd87
...
@@ -11,6 +11,7 @@ from flask.ext.admin.model.form import InlineFormAdmin, InlineModelConverterBase
...
@@ -11,6 +11,7 @@ from flask.ext.admin.model.form import InlineFormAdmin, InlineModelConverterBase
from
flask.ext.admin.model.fields
import
InlineModelFormField
,
InlineFieldList
,
AjaxSelectField
from
flask.ext.admin.model.fields
import
InlineModelFormField
,
InlineFieldList
,
AjaxSelectField
from
.tools
import
get_primary_key
from
.tools
import
get_primary_key
from
.ajax
import
create_ajax_loader
class
InlineModelFormList
(
InlineFieldList
):
class
InlineModelFormList
(
InlineFieldList
):
...
@@ -90,7 +91,7 @@ class CustomModelConverter(ModelConverter):
...
@@ -90,7 +91,7 @@ class CustomModelConverter(ModelConverter):
self
.
converters
[
TimeField
]
=
self
.
handle_time
self
.
converters
[
TimeField
]
=
self
.
handle_time
def
handle_foreign_key
(
self
,
model
,
field
,
**
kwargs
):
def
handle_foreign_key
(
self
,
model
,
field
,
**
kwargs
):
loader
=
self
.
view
.
_form_ajax_refs
.
get
(
field
.
name
)
loader
=
getattr
(
self
.
view
,
'_form_ajax_refs'
,
{})
.
get
(
field
.
name
)
if
loader
:
if
loader
:
if
field
.
null
:
if
field
.
null
:
...
@@ -173,8 +174,31 @@ class InlineModelConverter(InlineModelConverterBase):
...
@@ -173,8 +174,31 @@ class InlineModelConverter(InlineModelConverterBase):
info
=
InlineFormAdmin
(
model
,
**
attrs
)
info
=
InlineFormAdmin
(
model
,
**
attrs
)
# Resolve AJAX FKs
info
.
_form_ajax_refs
=
self
.
process_ajax_refs
(
info
)
return
info
return
info
def
process_ajax_refs
(
self
,
info
):
refs
=
getattr
(
info
,
'form_ajax_refs'
,
None
)
result
=
{}
if
refs
:
for
name
,
opts
in
iteritems
(
refs
):
new_name
=
'
%
s.
%
s'
%
(
info
.
model
.
__name__
.
lower
(),
name
)
loader
=
None
if
isinstance
(
opts
,
(
list
,
tuple
)):
loader
=
create_ajax_loader
(
info
.
model
,
new_name
,
name
,
opts
)
else
:
loader
=
opts
result
[
name
]
=
loader
self
.
view
.
_form_ajax_refs
[
new_name
]
=
loader
return
result
def
contribute
(
self
,
converter
,
model
,
form_class
,
inline_model
):
def
contribute
(
self
,
converter
,
model
,
form_class
,
inline_model
):
# Find property from target model to current model
# Find property from target model to current model
reverse_field
=
None
reverse_field
=
None
...
...
flask_admin/contrib/peewee/view.py
View file @
9236dd87
...
@@ -13,7 +13,7 @@ from flask.ext.admin.contrib.peewee import filters
...
@@ -13,7 +13,7 @@ from flask.ext.admin.contrib.peewee import filters
from
.form
import
get_form
,
CustomModelConverter
,
InlineModelConverter
,
save_inline
from
.form
import
get_form
,
CustomModelConverter
,
InlineModelConverter
,
save_inline
from
.tools
import
get_primary_key
,
parse_like_term
from
.tools
import
get_primary_key
,
parse_like_term
from
.ajax
import
QueryAjaxModelLoader
from
.ajax
import
QueryAjaxModelLoader
,
create_ajax_loader
class
ModelView
(
BaseModelView
):
class
ModelView
(
BaseModelView
):
...
@@ -244,27 +244,7 @@ class ModelView(BaseModelView):
...
@@ -244,27 +244,7 @@ class ModelView(BaseModelView):
# AJAX foreignkey support
# AJAX foreignkey support
def
_create_ajax_loader
(
self
,
name
,
fields
):
def
_create_ajax_loader
(
self
,
name
,
fields
):
prop
=
getattr
(
self
.
model
,
name
,
None
)
return
create_ajax_loader
(
self
.
model
,
name
,
name
,
fields
)
if
prop
is
None
:
raise
ValueError
(
'Model
%
s does not have field
%
s.'
%
(
self
.
model
,
name
))
# 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
)
def
_handle_join
(
self
,
query
,
field
,
joins
):
def
_handle_join
(
self
,
query
,
field
,
joins
):
if
field
.
model_class
!=
self
.
model
:
if
field
.
model_class
!=
self
.
model
:
...
...
flask_admin/contrib/sqla/form.py
View file @
9236dd87
...
@@ -508,7 +508,6 @@ class InlineModelConverter(InlineModelConverterBase):
...
@@ -508,7 +508,6 @@ class InlineModelConverter(InlineModelConverterBase):
return
result
return
result
def
contribute
(
self
,
model
,
form_class
,
inline_model
):
def
contribute
(
self
,
model
,
form_class
,
inline_model
):
"""
"""
Generate form fields for inline forms and contribute them to
Generate form fields for inline forms and contribute them to
...
...
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