Add generic "bulk delete" support to MasterView
This commit is contained in:
parent
9712868406
commit
6ed752d477
|
@ -34,6 +34,11 @@
|
||||||
padding: 0 0.5em 0 0;
|
padding: 0 0.5em 0 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
.newgrid-wrapper .grid-header td.tools form {
|
||||||
|
display: inline-block;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
/******************************
|
/******************************
|
||||||
* filters
|
* filters
|
||||||
******************************/
|
******************************/
|
||||||
|
|
|
@ -43,6 +43,25 @@
|
||||||
|
|
||||||
% endif
|
% endif
|
||||||
|
|
||||||
|
% if master.bulk_deletable and request.has_perm('{}.bulk_delete'.format(permission_prefix)):
|
||||||
|
|
||||||
|
$('form[name="bulk-delete"] button').click(function() {
|
||||||
|
var count = 0;
|
||||||
|
var match = /showing \d+ thru \d+ of (\S+)/.exec($('.pager .showing').text());
|
||||||
|
if (match) {
|
||||||
|
count = match[1];
|
||||||
|
} else {
|
||||||
|
alert("There don't seem to be any results to delete!");
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
if (! confirm("You are about to delete " + count + " ${model_title_plural}.\n\nAre you sure?")) {
|
||||||
|
return
|
||||||
|
}
|
||||||
|
$(this).button('disable').button('option', 'label', "Deleting Results...");
|
||||||
|
$('form[name="bulk-delete"]').submit();
|
||||||
|
});
|
||||||
|
|
||||||
|
% endif
|
||||||
});
|
});
|
||||||
</script>
|
</script>
|
||||||
</%def>
|
</%def>
|
||||||
|
@ -61,6 +80,12 @@
|
||||||
<button type="submit">Merge 2 ${model_title_plural}</button>
|
<button type="submit">Merge 2 ${model_title_plural}</button>
|
||||||
${h.end_form()}
|
${h.end_form()}
|
||||||
% endif
|
% endif
|
||||||
|
% if master.bulk_deletable and request.has_perm('{}.bulk_delete'.format(permission_prefix)):
|
||||||
|
${h.form(url('{}.bulk_delete'.format(route_prefix)), name='bulk-delete')}
|
||||||
|
${h.csrf_token(request)}
|
||||||
|
<button type="button">Delete Results</button>
|
||||||
|
${h.end_form()}
|
||||||
|
% endif
|
||||||
</%def>
|
</%def>
|
||||||
|
|
||||||
${grid.render_complete(tools=capture(self.grid_tools).strip(), context_menu=capture(self.context_menu_items).strip())|n}
|
${grid.render_complete(tools=capture(self.grid_tools).strip(), context_menu=capture(self.context_menu_items).strip())|n}
|
||||||
|
|
|
@ -54,6 +54,7 @@ class MasterView(View):
|
||||||
viewable = True
|
viewable = True
|
||||||
editable = True
|
editable = True
|
||||||
deletable = True
|
deletable = True
|
||||||
|
bulk_deletable = False
|
||||||
mergeable = False
|
mergeable = False
|
||||||
|
|
||||||
listing = False
|
listing = False
|
||||||
|
@ -408,6 +409,19 @@ class MasterView(View):
|
||||||
'instance_title': instance_title,
|
'instance_title': instance_title,
|
||||||
'form': form})
|
'form': form})
|
||||||
|
|
||||||
|
def bulk_delete(self):
|
||||||
|
"""
|
||||||
|
Delete all records matching the current grid query
|
||||||
|
"""
|
||||||
|
if self.request.method == 'POST':
|
||||||
|
query = self.get_effective_query(sortable=False)
|
||||||
|
count = query.count()
|
||||||
|
query.delete(synchronize_session=False)
|
||||||
|
self.request.session.flash("Deleted {:,d} {}".format(count, self.get_model_title_plural()))
|
||||||
|
else:
|
||||||
|
self.request.session.flash("Sorry, you must POST to do a bulk delete operation")
|
||||||
|
return self.redirect(self.get_index_url())
|
||||||
|
|
||||||
def get_merge_fields(self):
|
def get_merge_fields(self):
|
||||||
if hasattr(self, 'merge_fields'):
|
if hasattr(self, 'merge_fields'):
|
||||||
return self.merge_fields
|
return self.merge_fields
|
||||||
|
@ -895,7 +909,7 @@ class MasterView(View):
|
||||||
"""
|
"""
|
||||||
return session.query(self.get_model_class())
|
return session.query(self.get_model_class())
|
||||||
|
|
||||||
def get_effective_data(self, session=None):
|
def get_effective_data(self, session=None, **kwargs):
|
||||||
"""
|
"""
|
||||||
Convenience method which returns the "effective" data for the master
|
Convenience method which returns the "effective" data for the master
|
||||||
grid, filtered and sorted to match what would show on the UI, but not
|
grid, filtered and sorted to match what would show on the UI, but not
|
||||||
|
@ -903,12 +917,14 @@ class MasterView(View):
|
||||||
"""
|
"""
|
||||||
if session is None:
|
if session is None:
|
||||||
session = self.Session()
|
session = self.Session()
|
||||||
grid = self.make_grid(session=session, pageable=False,
|
kwargs.setdefault('pageable', False)
|
||||||
main_actions=[], more_actions=[])
|
kwargs.setdefault('main_actions', [])
|
||||||
|
kwargs.setdefault('more_actions', [])
|
||||||
|
grid = self.make_grid(session=session, **kwargs)
|
||||||
return grid._fa_grid.rows
|
return grid._fa_grid.rows
|
||||||
|
|
||||||
def get_effective_query(self, session):
|
def get_effective_query(self, session=None, **kwargs):
|
||||||
return self.get_effective_data(session)
|
return self.get_effective_data(session=session, **kwargs)
|
||||||
|
|
||||||
def checkbox(self, instance):
|
def checkbox(self, instance):
|
||||||
"""
|
"""
|
||||||
|
@ -1295,6 +1311,14 @@ class MasterView(View):
|
||||||
config.add_tailbone_permission(permission_prefix, '{0}.create'.format(permission_prefix),
|
config.add_tailbone_permission(permission_prefix, '{0}.create'.format(permission_prefix),
|
||||||
"Create new {0}".format(model_title))
|
"Create new {0}".format(model_title))
|
||||||
|
|
||||||
|
# bulk delete
|
||||||
|
if cls.bulk_deletable:
|
||||||
|
config.add_route('{}.bulk_delete'.format(route_prefix), '{}/bulk-delete'.format(url_prefix))
|
||||||
|
config.add_view(cls, attr='bulk_delete', route_name='{}.bulk_delete'.format(route_prefix),
|
||||||
|
permission='{}.bulk_delete'.format(permission_prefix))
|
||||||
|
config.add_tailbone_permission(permission_prefix, '{}.bulk_delete'.format(permission_prefix),
|
||||||
|
"Bulk delete {}".format(model_title_plural))
|
||||||
|
|
||||||
# merge
|
# merge
|
||||||
if cls.mergeable:
|
if cls.mergeable:
|
||||||
config.add_route('{}.merge'.format(route_prefix), '{}/merge'.format(url_prefix))
|
config.add_route('{}.merge'.format(route_prefix), '{}/merge'.format(url_prefix))
|
||||||
|
|
Loading…
Reference in a new issue