Commit ea80e70e authored by Serge S. Koval's avatar Serge S. Koval

Added support for non-int PK. Fixed #9

parent 8679ea33
......@@ -8,7 +8,7 @@
- Search
- Rename init_search
- Filters
- FK filters support
- Custom filters for date fields
- Paginator class
- Custom CSS/JS in admin interface
- Checkboxes and mass operations
......@@ -23,3 +23,4 @@
- Localization
- Unit tests
- Documentation
- Add all new stuff
\ No newline at end of file
......@@ -102,11 +102,28 @@ class AdminModelConverter(ModelConverter):
if hasattr(prop, 'columns'):
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
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 column.unique:
if column.unique and not unique:
kwargs['validators'].append(Unique(self.view.session,
model,
column))
......
......@@ -709,8 +709,8 @@ class BaseModelView(BaseView):
form=form,
return_url=return_url)
@expose('/edit/<int:id>/', methods=('GET', 'POST'))
def edit_view(self, id):
@expose('/edit/', methods=('GET', 'POST'))
def edit_view(self):
"""
Edit model view
"""
......@@ -719,6 +719,10 @@ class BaseModelView(BaseView):
if not self.can_edit:
return redirect(return_url)
id = request.args.get('id')
if id is None:
return redirect(return_url)
model = self.get_one(id)
if model is None:
......@@ -734,8 +738,8 @@ class BaseModelView(BaseView):
form=form,
return_url=return_url)
@expose('/delete/<int:id>/', methods=('POST',))
def delete_view(self, id):
@expose('/delete/', methods=('POST',))
def delete_view(self):
"""
Delete model view. Only POST method is allowed.
"""
......@@ -745,6 +749,10 @@ class BaseModelView(BaseView):
if not self.can_delete:
return redirect(return_url)
id = request.args.get('id')
if id is None:
return redirect(return_url)
model = self.get_one(id)
if model:
......
......@@ -81,7 +81,7 @@ class MockModelView(base.BaseModelView):
return len(self.all_models), self.all_models.itervalues()
def get_one(self, id):
return self.all_models.get(id)
return self.all_models.get(int(id))
def create_model(self, form):
model = Model(self.last_id)
......@@ -136,7 +136,6 @@ def test_mockview():
# Make model view requests
rv = client.get('/admin/modelview/')
eq_(rv.status_code, 200)
ok_('/admin/modelview/delete/1/' in rv.data)
# Test model creation view
rv = client.get('/admin/modelview/new/')
......@@ -154,11 +153,11 @@ def test_mockview():
eq_(model.col3, 'test3')
# Try model edit view
rv = client.get('/admin/modelview/edit/3/')
rv = client.get('/admin/modelview/edit/?id=3')
eq_(rv.status_code, 200)
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#'))
eq_(rv.status_code, 302)
eq_(len(view.updated_models), 1)
......@@ -168,11 +167,11 @@ def test_mockview():
eq_(model.col2, '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)
# 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.headers['location'], 'http://localhost/admin/modelview/')
......@@ -190,11 +189,11 @@ def test_permissions():
eq_(rv.status_code, 302)
view.can_edit = False
rv = client.get('/admin/modelview/edit/1/')
rv = client.get('/admin/modelview/edit/?id=1')
eq_(rv.status_code, 302)
view.can_delete = False
rv = client.post('/admin/modelview/delete/1/')
rv = client.post('/admin/modelview/delete/?id=1')
eq_(rv.status_code, 302)
......@@ -224,7 +223,7 @@ def test_templates():
rv = client.get('/admin/modelview/new/')
eq_(rv.data, 'Success!')
rv = client.get('/admin/modelview/edit/1/')
rv = client.get('/admin/modelview/edit/?id=1')
eq_(rv.data, 'Success!')
......
......@@ -108,7 +108,7 @@ def test_model():
eq_(rv.status_code, 200)
ok_('test1large' in rv.data)
url = '/admin/model1view/edit/%d/' % model.id
url = '/admin/model1view/edit/?id=%s' % model.id
rv = client.get(url)
eq_(rv.status_code, 200)
......@@ -122,7 +122,7 @@ def test_model():
eq_(model.test3, '')
eq_(model.test4, '')
url = '/admin/model1view/delete/%d/' % model.id
url = '/admin/model1view/delete/?id=%s' % model.id
rv = client.post(url)
eq_(rv.status_code, 302)
eq_(db.session.query(Model1).count(), 0)
......@@ -298,6 +298,36 @@ def test_url_args():
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():
# TODO: form_columns
# TODO: excluded_form_columns
......
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