Add speed bump / confirmation page when deleting records.

Also cleanup the context menu links on various master CRUD pages.
This commit is contained in:
Lance Edgar 2016-01-07 20:55:10 -06:00
parent 94406f84b3
commit 640bb736b2
4 changed files with 84 additions and 20 deletions

View file

@ -33,7 +33,7 @@ from edbob.util import prettify
import formalchemy
from pyramid.renderers import get_renderer, render_to_response
from pyramid.httpexceptions import HTTPFound, HTTPNotFound
from pyramid.httpexceptions import HTTPException, HTTPFound, HTTPNotFound
from tailbone import forms
from tailbone.views import View
@ -148,16 +148,28 @@ class MasterView(View):
self.deleting = True
instance = self.get_instance()
# Let derived classes prep for (or cancel) deletion.
result = self.before_delete(instance)
if result is not None:
return result
if not self.deletable_instance(instance):
self.request.session.flash("Deletion is not permitted for {} {}".format(
self.get_model_title(), instance))
return HTTPFound(location=self.get_action_url('view', instance))
self.delete_instance(instance)
self.request.session.flash("{0} {1} has been deleted.".format(
self.get_model_title(), instance))
return self.redirect(self.get_after_delete_url(instance))
form = self.make_form(instance)
# TODO: Add better validation, ideally CSRF etc.
if self.request.method == 'POST':
# Let derived classes prep for (or cancel) deletion.
result = self.before_delete(instance)
if isinstance(result, HTTPException):
return result
self.delete_instance(instance)
self.request.session.flash("{} {} has been deleted.".format(
self.get_model_title(), instance))
return self.redirect(self.get_after_delete_url(instance))
form.readonly = True
return self.render_to_response('delete', {'instance': instance, 'form': form})
##############################
# Core Stuff
@ -379,9 +391,14 @@ class MasterView(View):
if self.editable:
actions.append(self.make_action('edit', icon='pencil'))
if self.deletable:
actions.append(self.make_action('delete', icon='trash'))
actions.append(self.make_action('delete', icon='trash', url=self.default_delete_url))
return actions
def default_delete_url(self, row):
if self.deletable_instance(row):
return self.request.route_url('{}.delete'.format(self.get_route_prefix()),
**self.get_action_route_kwargs(row))
def make_action(self, key, **kwargs):
"""
Make a new :class:`GridAction` instance for the current grid.