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 @@ ...@@ -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
...@@ -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))
......
...@@ -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:
......
...@@ -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(id) return self.all_models.get(int(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!')
......
...@@ -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
......
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