Commit 5d7e5100 authored by Serge S. Koval's avatar Serge S. Koval

Fixed #524. Exception formatting callback and handle SQLa IntegrityErrors even in debug mode

parent 56f32cb3
...@@ -492,7 +492,7 @@ class ModelView(BaseModelView): ...@@ -492,7 +492,7 @@ class ModelView(BaseModelView):
self._on_model_change(form, model, True) self._on_model_change(form, model, True)
model.save() model.save()
except Exception as ex: except Exception as ex:
if self._debug: if not self.handle_view_exception(ex):
raise raise
flash(gettext('Failed to create model. %(error)s', flash(gettext('Failed to create model. %(error)s',
...@@ -519,7 +519,7 @@ class ModelView(BaseModelView): ...@@ -519,7 +519,7 @@ class ModelView(BaseModelView):
self._on_model_change(form, model, False) self._on_model_change(form, model, False)
model.save() model.save()
except Exception as ex: except Exception as ex:
if self._debug: if not self.handle_view_exception(ex):
raise raise
flash(gettext('Failed to update model. %(error)s', flash(gettext('Failed to update model. %(error)s',
...@@ -544,7 +544,7 @@ class ModelView(BaseModelView): ...@@ -544,7 +544,7 @@ class ModelView(BaseModelView):
model.delete() model.delete()
return True return True
except Exception as ex: except Exception as ex:
if self._debug: if not self.handle_view_exception(ex):
raise raise
flash(gettext('Failed to delete model. %(error)s', flash(gettext('Failed to delete model. %(error)s',
...@@ -599,7 +599,7 @@ class ModelView(BaseModelView): ...@@ -599,7 +599,7 @@ class ModelView(BaseModelView):
count, count,
count=count)) count=count))
except Exception as ex: except Exception as ex:
if self._debug: if not self.handle_view_exception(ex):
raise raise
flash(gettext('Failed to delete models. %(error)s', error=str(ex)), flash(gettext('Failed to delete models. %(error)s', error=str(ex)),
......
...@@ -349,7 +349,7 @@ class ModelView(BaseModelView): ...@@ -349,7 +349,7 @@ 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)
except Exception as ex: except Exception as ex:
if self._debug: if not self.handle_view_exception(ex):
raise raise
flash(gettext('Failed to create model. %(error)s', error=str(ex)), 'error') flash(gettext('Failed to create model. %(error)s', error=str(ex)), 'error')
...@@ -369,7 +369,7 @@ class ModelView(BaseModelView): ...@@ -369,7 +369,7 @@ 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)
except Exception as ex: except Exception as ex:
if self._debug: if not self.handle_view_exception(ex):
raise raise
flash(gettext('Failed to update model. %(error)s', error=str(ex)), 'error') flash(gettext('Failed to update model. %(error)s', error=str(ex)), 'error')
...@@ -386,7 +386,7 @@ class ModelView(BaseModelView): ...@@ -386,7 +386,7 @@ class ModelView(BaseModelView):
model.delete_instance(recursive=True) model.delete_instance(recursive=True)
return True return True
except Exception as ex: except Exception as ex:
if self._debug: if not self.handle_view_exception(ex):
raise raise
flash(gettext('Failed to delete model. %(error)s', error=str(ex)), 'error') flash(gettext('Failed to delete model. %(error)s', error=str(ex)), 'error')
...@@ -424,7 +424,7 @@ class ModelView(BaseModelView): ...@@ -424,7 +424,7 @@ class ModelView(BaseModelView):
count, count,
count=count)) count=count))
except Exception as ex: except Exception as ex:
if self._debug: if not self.handle_view_exception(ex):
raise raise
flash(gettext('Failed to delete models. %(error)s', error=str(ex)), 'error') flash(gettext('Failed to delete models. %(error)s', error=str(ex)), 'error')
...@@ -4,6 +4,7 @@ from sqlalchemy.orm.attributes import InstrumentedAttribute ...@@ -4,6 +4,7 @@ from sqlalchemy.orm.attributes import InstrumentedAttribute
from sqlalchemy.orm import joinedload from sqlalchemy.orm import joinedload
from sqlalchemy.sql.expression import desc from sqlalchemy.sql.expression import desc
from sqlalchemy import Column, Boolean, func, or_ from sqlalchemy import Column, Boolean, func, or_
from sqlalchemy.exc import IntegrityError
from flask import flash from flask import flash
...@@ -784,6 +785,14 @@ class ModelView(BaseModelView): ...@@ -784,6 +785,14 @@ class ModelView(BaseModelView):
""" """
return self.session.query(self.model).get(id) return self.session.query(self.model).get(id)
# Error handler
def handle_view_exception(self, exc):
if isinstance(exc, IntegrityError):
flash(gettext('Integrity error. %(message)s', message=exc.message), 'error')
return True
return super(BaseModelView, self).handle_view_exception(exc)
# Model handlers # Model handlers
def create_model(self, form): def create_model(self, form):
""" """
...@@ -799,7 +808,7 @@ class ModelView(BaseModelView): ...@@ -799,7 +808,7 @@ class ModelView(BaseModelView):
self._on_model_change(form, model, True) self._on_model_change(form, model, True)
self.session.commit() self.session.commit()
except Exception as ex: except Exception as ex:
if self._debug: if not self.handle_view_exception(ex):
raise raise
flash(gettext('Failed to create model. %(error)s', error=str(ex)), 'error') flash(gettext('Failed to create model. %(error)s', error=str(ex)), 'error')
...@@ -825,7 +834,7 @@ class ModelView(BaseModelView): ...@@ -825,7 +834,7 @@ class ModelView(BaseModelView):
self._on_model_change(form, model, False) self._on_model_change(form, model, False)
self.session.commit() self.session.commit()
except Exception as ex: except Exception as ex:
if self._debug: if not self.handle_view_exception(ex):
raise raise
flash(gettext('Failed to update model. %(error)s', error=str(ex)), 'error') flash(gettext('Failed to update model. %(error)s', error=str(ex)), 'error')
...@@ -852,7 +861,7 @@ class ModelView(BaseModelView): ...@@ -852,7 +861,7 @@ class ModelView(BaseModelView):
self.session.commit() self.session.commit()
return True return True
except Exception as ex: except Exception as ex:
if self._debug: if not self.handle_view_exception(ex):
raise raise
flash(gettext('Failed to delete model. %(error)s', error=str(ex)), 'error') flash(gettext('Failed to delete model. %(error)s', error=str(ex)), 'error')
...@@ -892,7 +901,7 @@ class ModelView(BaseModelView): ...@@ -892,7 +901,7 @@ class ModelView(BaseModelView):
count, count,
count=count)) count=count))
except Exception as ex: except Exception as ex:
if self._debug: if not self.handle_view_exception(ex):
raise raise
flash(gettext('Failed to delete models. %(error)s', error=str(ex)), 'error') flash(gettext('Failed to delete models. %(error)s', error=str(ex)), 'error')
...@@ -878,6 +878,13 @@ class BaseModelView(BaseView, ActionsMixin): ...@@ -878,6 +878,13 @@ class BaseModelView(BaseView, ActionsMixin):
""" """
raise NotImplemented('Please implement get_one method') raise NotImplemented('Please implement get_one method')
# Exception handler
def handle_view_exception(self, exc):
if self._debug:
return False
return True
# Model event handlers # Model event handlers
def on_model_change(self, form, model, is_created): def on_model_change(self, form, model, is_created):
""" """
......
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