diff --git a/tailbone/views/batch/core.py b/tailbone/views/batch/core.py index cde2b2ba..b1f72e5f 100644 --- a/tailbone/views/batch/core.py +++ b/tailbone/views/batch/core.py @@ -138,8 +138,10 @@ class BatchMasterView(MasterView): g.filters['executed'].default_active = True g.filters['executed'].default_verb = 'is_null' - g.sorters['created_by'] = g.make_sorter(model.User.username) - g.sorters['executed_by'] = g.make_sorter(model.User.username) + # TODO: in some cases grid has no sorters yet..e.g. when building query for bulk-delete + if hasattr(g, 'sorters'): + g.sorters['created_by'] = g.make_sorter(model.User.username) + g.sorters['executed_by'] = g.make_sorter(model.User.username) g.default_sortkey = 'created' g.default_sortdir = 'desc' diff --git a/tailbone/views/batch/pricing.py b/tailbone/views/batch/pricing.py index 0b16e853..ad49fff4 100644 --- a/tailbone/views/batch/pricing.py +++ b/tailbone/views/batch/pricing.py @@ -44,6 +44,7 @@ class PricingBatchView(BatchMasterView): url_prefix = '/batches/pricing' creatable = False rows_editable = True + bulk_deletable = True def configure_fieldset(self, fs): fs.configure( diff --git a/tailbone/views/master.py b/tailbone/views/master.py index dfa715a5..20951e50 100644 --- a/tailbone/views/master.py +++ b/tailbone/views/master.py @@ -675,12 +675,19 @@ class MasterView(View): if self.request.method == 'POST': query = self.get_effective_query(sortable=False) count = query.count() - query.delete(synchronize_session=False) + self.bulk_delete_objects(query) 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 bulk_delete_objects(self, query): + # TODO: sometimes the first makes sense, and would be preferred for + # efficiency's sake. might even need to add progress to latter? + # query.delete(synchronize_session=False) + for obj in query: + self.Session.delete(obj) + def get_merge_fields(self): if hasattr(self, 'merge_fields'): return self.merge_fields