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
ea80e70e
Commit
ea80e70e
authored
Apr 05, 2012
by
Serge S. Koval
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
Added support for non-int PK. Fixed #9
parent
8679ea33
Changes
5
Hide whitespace changes
Inline
Side-by-side
Showing
5 changed files
with
73 additions
and
18 deletions
+73
-18
TODO.txt
TODO.txt
+2
-1
form.py
flask_adminex/ext/sqlamodel/form.py
+19
-2
base.py
flask_adminex/model/base.py
+12
-4
test_model.py
flask_adminex/tests/test_model.py
+8
-9
test_sqlamodel.py
flask_adminex/tests/test_sqlamodel.py
+32
-2
No files found.
TODO.txt
View file @
ea80e70e
...
@@ -8,7 +8,7 @@
...
@@ -8,7 +8,7 @@
- Search
- Search
- Rename init_search
- Rename init_search
- Filters
- Filters
-
FK filters support
-
Custom filters for date fields
- Paginator class
- Paginator class
- Custom CSS/JS in admin interface
- Custom CSS/JS in admin interface
- Checkboxes and mass operations
- Checkboxes and mass operations
...
@@ -23,3 +23,4 @@
...
@@ -23,3 +23,4 @@
- Localization
- Localization
- Unit tests
- Unit tests
- Documentation
- Documentation
- Add all new stuff
\ No newline at end of file
flask_adminex/ext/sqlamodel/form.py
View file @
ea80e70e
...
@@ -102,11 +102,28 @@ class AdminModelConverter(ModelConverter):
...
@@ -102,11 +102,28 @@ class AdminModelConverter(ModelConverter):
if
hasattr
(
prop
,
'columns'
):
if
hasattr
(
prop
,
'columns'
):
column
=
prop
.
columns
[
0
]
column
=
prop
.
columns
[
0
]
if
column
.
foreign_keys
or
column
.
primary_key
:
# Do not display foreign keys - use relations
if
column
.
foreign_keys
:
return
None
return
None
unique
=
False
if
column
.
primary_key
:
# By default, don't show primary keys either
if
self
.
view
.
form_columns
is
None
:
return
None
# If PK is not explicitly allowed, ignore it
if
prop
.
key
not
in
self
.
view
.
form_columns
:
return
None
kwargs
[
'validators'
]
.
append
(
Unique
(
self
.
view
.
session
,
model
,
column
))
unique
=
True
# If field is unique, validate it
# If field is unique, validate it
if
column
.
unique
:
if
column
.
unique
and
not
unique
:
kwargs
[
'validators'
]
.
append
(
Unique
(
self
.
view
.
session
,
kwargs
[
'validators'
]
.
append
(
Unique
(
self
.
view
.
session
,
model
,
model
,
column
))
column
))
...
...
flask_adminex/model/base.py
View file @
ea80e70e
...
@@ -709,8 +709,8 @@ class BaseModelView(BaseView):
...
@@ -709,8 +709,8 @@ class BaseModelView(BaseView):
form
=
form
,
form
=
form
,
return_url
=
return_url
)
return_url
=
return_url
)
@
expose
(
'/edit/
<int:id>/
'
,
methods
=
(
'GET'
,
'POST'
))
@
expose
(
'/edit/'
,
methods
=
(
'GET'
,
'POST'
))
def
edit_view
(
self
,
id
):
def
edit_view
(
self
):
"""
"""
Edit model view
Edit model view
"""
"""
...
@@ -719,6 +719,10 @@ class BaseModelView(BaseView):
...
@@ -719,6 +719,10 @@ class BaseModelView(BaseView):
if
not
self
.
can_edit
:
if
not
self
.
can_edit
:
return
redirect
(
return_url
)
return
redirect
(
return_url
)
id
=
request
.
args
.
get
(
'id'
)
if
id
is
None
:
return
redirect
(
return_url
)
model
=
self
.
get_one
(
id
)
model
=
self
.
get_one
(
id
)
if
model
is
None
:
if
model
is
None
:
...
@@ -734,8 +738,8 @@ class BaseModelView(BaseView):
...
@@ -734,8 +738,8 @@ class BaseModelView(BaseView):
form
=
form
,
form
=
form
,
return_url
=
return_url
)
return_url
=
return_url
)
@
expose
(
'/delete/
<int:id>/
'
,
methods
=
(
'POST'
,))
@
expose
(
'/delete/'
,
methods
=
(
'POST'
,))
def
delete_view
(
self
,
id
):
def
delete_view
(
self
):
"""
"""
Delete model view. Only POST method is allowed.
Delete model view. Only POST method is allowed.
"""
"""
...
@@ -745,6 +749,10 @@ class BaseModelView(BaseView):
...
@@ -745,6 +749,10 @@ class BaseModelView(BaseView):
if
not
self
.
can_delete
:
if
not
self
.
can_delete
:
return
redirect
(
return_url
)
return
redirect
(
return_url
)
id
=
request
.
args
.
get
(
'id'
)
if
id
is
None
:
return
redirect
(
return_url
)
model
=
self
.
get_one
(
id
)
model
=
self
.
get_one
(
id
)
if
model
:
if
model
:
...
...
flask_adminex/tests/test_model.py
View file @
ea80e70e
...
@@ -81,7 +81,7 @@ class MockModelView(base.BaseModelView):
...
@@ -81,7 +81,7 @@ class MockModelView(base.BaseModelView):
return
len
(
self
.
all_models
),
self
.
all_models
.
itervalues
()
return
len
(
self
.
all_models
),
self
.
all_models
.
itervalues
()
def
get_one
(
self
,
id
):
def
get_one
(
self
,
id
):
return
self
.
all_models
.
get
(
i
d
)
return
self
.
all_models
.
get
(
i
nt
(
id
)
)
def
create_model
(
self
,
form
):
def
create_model
(
self
,
form
):
model
=
Model
(
self
.
last_id
)
model
=
Model
(
self
.
last_id
)
...
@@ -136,7 +136,6 @@ def test_mockview():
...
@@ -136,7 +136,6 @@ def test_mockview():
# Make model view requests
# Make model view requests
rv
=
client
.
get
(
'/admin/modelview/'
)
rv
=
client
.
get
(
'/admin/modelview/'
)
eq_
(
rv
.
status_code
,
200
)
eq_
(
rv
.
status_code
,
200
)
ok_
(
'/admin/modelview/delete/1/'
in
rv
.
data
)
# Test model creation view
# Test model creation view
rv
=
client
.
get
(
'/admin/modelview/new/'
)
rv
=
client
.
get
(
'/admin/modelview/new/'
)
...
@@ -154,11 +153,11 @@ def test_mockview():
...
@@ -154,11 +153,11 @@ def test_mockview():
eq_
(
model
.
col3
,
'test3'
)
eq_
(
model
.
col3
,
'test3'
)
# Try model edit view
# Try model edit view
rv
=
client
.
get
(
'/admin/modelview/edit/
3/
'
)
rv
=
client
.
get
(
'/admin/modelview/edit/
?id=3
'
)
eq_
(
rv
.
status_code
,
200
)
eq_
(
rv
.
status_code
,
200
)
ok_
(
'test1'
in
rv
.
data
)
ok_
(
'test1'
in
rv
.
data
)
rv
=
client
.
post
(
'/admin/modelview/edit/
3/
'
,
rv
=
client
.
post
(
'/admin/modelview/edit/
?id=3
'
,
data
=
dict
(
col1
=
'test!'
,
col2
=
'test@'
,
col3
=
'test#'
))
data
=
dict
(
col1
=
'test!'
,
col2
=
'test@'
,
col3
=
'test#'
))
eq_
(
rv
.
status_code
,
302
)
eq_
(
rv
.
status_code
,
302
)
eq_
(
len
(
view
.
updated_models
),
1
)
eq_
(
len
(
view
.
updated_models
),
1
)
...
@@ -168,11 +167,11 @@ def test_mockview():
...
@@ -168,11 +167,11 @@ def test_mockview():
eq_
(
model
.
col2
,
'test@'
)
eq_
(
model
.
col2
,
'test@'
)
eq_
(
model
.
col3
,
'test#'
)
eq_
(
model
.
col3
,
'test#'
)
rv
=
client
.
get
(
'/admin/modelview/edit/
4/
'
)
rv
=
client
.
get
(
'/admin/modelview/edit/
?id=4
'
)
eq_
(
rv
.
status_code
,
302
)
eq_
(
rv
.
status_code
,
302
)
# Attempt to delete model
# Attempt to delete model
rv
=
client
.
post
(
'/admin/modelview/delete/
3/
'
)
rv
=
client
.
post
(
'/admin/modelview/delete/
?id=3
'
)
eq_
(
rv
.
status_code
,
302
)
eq_
(
rv
.
status_code
,
302
)
eq_
(
rv
.
headers
[
'location'
],
'http://localhost/admin/modelview/'
)
eq_
(
rv
.
headers
[
'location'
],
'http://localhost/admin/modelview/'
)
...
@@ -190,11 +189,11 @@ def test_permissions():
...
@@ -190,11 +189,11 @@ def test_permissions():
eq_
(
rv
.
status_code
,
302
)
eq_
(
rv
.
status_code
,
302
)
view
.
can_edit
=
False
view
.
can_edit
=
False
rv
=
client
.
get
(
'/admin/modelview/edit/
1/
'
)
rv
=
client
.
get
(
'/admin/modelview/edit/
?id=1
'
)
eq_
(
rv
.
status_code
,
302
)
eq_
(
rv
.
status_code
,
302
)
view
.
can_delete
=
False
view
.
can_delete
=
False
rv
=
client
.
post
(
'/admin/modelview/delete/
1/
'
)
rv
=
client
.
post
(
'/admin/modelview/delete/
?id=1
'
)
eq_
(
rv
.
status_code
,
302
)
eq_
(
rv
.
status_code
,
302
)
...
@@ -224,7 +223,7 @@ def test_templates():
...
@@ -224,7 +223,7 @@ def test_templates():
rv
=
client
.
get
(
'/admin/modelview/new/'
)
rv
=
client
.
get
(
'/admin/modelview/new/'
)
eq_
(
rv
.
data
,
'Success!'
)
eq_
(
rv
.
data
,
'Success!'
)
rv
=
client
.
get
(
'/admin/modelview/edit/
1/
'
)
rv
=
client
.
get
(
'/admin/modelview/edit/
?id=1
'
)
eq_
(
rv
.
data
,
'Success!'
)
eq_
(
rv
.
data
,
'Success!'
)
...
...
flask_adminex/tests/test_sqlamodel.py
View file @
ea80e70e
...
@@ -108,7 +108,7 @@ def test_model():
...
@@ -108,7 +108,7 @@ def test_model():
eq_
(
rv
.
status_code
,
200
)
eq_
(
rv
.
status_code
,
200
)
ok_
(
'test1large'
in
rv
.
data
)
ok_
(
'test1large'
in
rv
.
data
)
url
=
'/admin/model1view/edit/
%
d/
'
%
model
.
id
url
=
'/admin/model1view/edit/
?id=
%
s
'
%
model
.
id
rv
=
client
.
get
(
url
)
rv
=
client
.
get
(
url
)
eq_
(
rv
.
status_code
,
200
)
eq_
(
rv
.
status_code
,
200
)
...
@@ -122,7 +122,7 @@ def test_model():
...
@@ -122,7 +122,7 @@ def test_model():
eq_
(
model
.
test3
,
''
)
eq_
(
model
.
test3
,
''
)
eq_
(
model
.
test4
,
''
)
eq_
(
model
.
test4
,
''
)
url
=
'/admin/model1view/delete/
%
d/
'
%
model
.
id
url
=
'/admin/model1view/delete/
?id=
%
s
'
%
model
.
id
rv
=
client
.
post
(
url
)
rv
=
client
.
post
(
url
)
eq_
(
rv
.
status_code
,
302
)
eq_
(
rv
.
status_code
,
302
)
eq_
(
db
.
session
.
query
(
Model1
)
.
count
(),
0
)
eq_
(
db
.
session
.
query
(
Model1
)
.
count
(),
0
)
...
@@ -298,6 +298,36 @@ def test_url_args():
...
@@ -298,6 +298,36 @@ def test_url_args():
ok_
(
'data2'
in
rv
.
data
)
ok_
(
'data2'
in
rv
.
data
)
def
test_non_int_pk
():
app
,
db
,
admin
=
setup
()
class
Model
(
db
.
Model
):
id
=
db
.
Column
(
db
.
String
,
primary_key
=
True
)
test
=
db
.
Column
(
db
.
String
)
db
.
create_all
()
view
=
CustomModelView
(
Model
,
db
.
session
,
form_columns
=
[
'id'
,
'test'
])
admin
.
add_view
(
view
)
client
=
app
.
test_client
()
rv
=
client
.
get
(
'/admin/modelview/'
)
eq_
(
rv
.
status_code
,
200
)
rv
=
client
.
post
(
'/admin/modelview/new/'
,
data
=
dict
(
id
=
'test1'
,
test
=
'test2'
))
eq_
(
rv
.
status_code
,
302
)
rv
=
client
.
get
(
'/admin/modelview/'
)
eq_
(
rv
.
status_code
,
200
)
ok_
(
'test1'
in
rv
.
data
)
rv
=
client
.
get
(
'/admin/modelview/edit/?id=test1'
)
eq_
(
rv
.
status_code
,
200
)
ok_
(
'test2'
in
rv
.
data
)
def
test_form
():
def
test_form
():
# TODO: form_columns
# TODO: form_columns
# TODO: excluded_form_columns
# TODO: excluded_form_columns
...
...
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