Commit 95ee8ebb authored by Serge S. Koval's avatar Serge S. Koval

Merge pull request #64 from baverman/master

on_model_change and on_model_delete hooks
parents 7d483ccb 6695cdfc
...@@ -282,6 +282,8 @@ class ModelView(BaseModelView): ...@@ -282,6 +282,8 @@ class ModelView(BaseModelView):
# For peewee have to save inline forms after model was saved # For peewee have to save inline forms after model was saved
save_inline(form, model) save_inline(form, model)
self.on_model_change(form, model)
return True return True
except Exception, ex: except Exception, ex:
flash(gettext('Failed to create model. %(error)s', error=str(ex)), 'error') flash(gettext('Failed to create model. %(error)s', error=str(ex)), 'error')
...@@ -295,6 +297,8 @@ class ModelView(BaseModelView): ...@@ -295,6 +297,8 @@ class ModelView(BaseModelView):
# For peewee have to save inline forms after model was saved # For peewee have to save inline forms after model was saved
save_inline(form, model) save_inline(form, model)
self.on_model_change(form, model)
return True return True
except Exception, ex: except Exception, ex:
flash(gettext('Failed to update model. %(error)s', error=str(ex)), 'error') flash(gettext('Failed to update model. %(error)s', error=str(ex)), 'error')
...@@ -302,6 +306,7 @@ class ModelView(BaseModelView): ...@@ -302,6 +306,7 @@ class ModelView(BaseModelView):
def delete_model(self, model): def delete_model(self, model):
try: try:
self.on_model_delete(model)
model.delete_instance(recursive=True) model.delete_instance(recursive=True)
return True return True
except Exception, ex: except Exception, ex:
......
...@@ -567,6 +567,8 @@ class ModelView(BaseModelView): ...@@ -567,6 +567,8 @@ class ModelView(BaseModelView):
model = self.model() model = self.model()
form.populate_obj(model) form.populate_obj(model)
self.session.add(model) self.session.add(model)
self.session.flush()
self.on_model_change(form, model)
self.session.commit() self.session.commit()
return True return True
except Exception, ex: except Exception, ex:
...@@ -584,6 +586,8 @@ class ModelView(BaseModelView): ...@@ -584,6 +586,8 @@ class ModelView(BaseModelView):
""" """
try: try:
form.populate_obj(model) form.populate_obj(model)
self.session.flush()
self.on_model_change(form, model)
self.session.commit() self.session.commit()
return True return True
except Exception, ex: except Exception, ex:
...@@ -598,6 +602,8 @@ class ModelView(BaseModelView): ...@@ -598,6 +602,8 @@ class ModelView(BaseModelView):
Model to delete Model to delete
""" """
try: try:
self.on_model_delete(model)
self.session.flush()
self.session.delete(model) self.session.delete(model)
self.session.commit() self.session.commit()
return True return True
......
...@@ -531,6 +531,28 @@ class BaseModelView(BaseView, ActionsMixin): ...@@ -531,6 +531,28 @@ class BaseModelView(BaseView, ActionsMixin):
raise NotImplemented('Please implement get_one method') raise NotImplemented('Please implement get_one method')
# Model handlers # Model handlers
def on_model_change(self, form, model):
"""
Allow to do some actions after a model was created or updated.
Called from create_model and update_model in the same transaction
(if it has any meaning for a store backend).
By default do nothing.
"""
pass
def on_model_delete(self, model):
"""
Allow to do some actions before a model will be deleted.
Called from delete_model in the same transaction
(if it has any meaning for a store backend).
By default do nothing.
"""
pass
def create_model(self, form): def create_model(self, form):
""" """
Create model from the form. Create model from the form.
......
...@@ -358,3 +358,37 @@ def test_form_override(): ...@@ -358,3 +358,37 @@ def test_form_override():
def test_relations(): def test_relations():
# TODO: test relations # TODO: test relations
pass pass
def test_on_model_change_delete():
app, db, admin = setup()
Model1, _ = create_models(db)
db.create_all()
class ModelView(CustomModelView):
def on_model_change(self, form, model):
model.test1 = model.test1.upper()
def on_model_delete(self, model):
self.deleted = True
view = ModelView(Model1, db.session)
admin.add_view(view)
client = app.test_client()
client.post('/admin/model1view/new/',
data=dict(test1='test1large', test2='test2'))
model = db.session.query(Model1).first()
eq_(model.test1, 'TEST1LARGE')
url = '/admin/model1view/edit/?id=%s' % model.id
client.post(url, data=dict(test1='test1small', test2='test2large'))
model = db.session.query(Model1).first()
eq_(model.test1, 'TEST1SMALL')
url = '/admin/model1view/delete/?id=%s' % model.id
client.post(url)
ok_(view.deleted)
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