From 907a356bea3af85785b7752e6532f5852e0d04c0 Mon Sep 17 00:00:00 2001 From: Lance Edgar Date: Mon, 16 Mar 2020 17:47:06 -0500 Subject: [PATCH] Add support for "bulk-delete" of Person table --- tailbone/views/master.py | 10 +++++++--- tailbone/views/people.py | 20 ++++++++++++++++++++ 2 files changed, 27 insertions(+), 3 deletions(-) diff --git a/tailbone/views/master.py b/tailbone/views/master.py index ae38f2b9..016ea41a 100644 --- a/tailbone/views/master.py +++ b/tailbone/views/master.py @@ -1855,7 +1855,7 @@ class MasterView(View): def bulk_delete_objects(self, session, objects, progress=None): def delete(obj, i): - session.delete(obj) + self.delete_instance(obj) if i % 1000 == 0: session.flush() @@ -3142,10 +3142,14 @@ class MasterView(View): """ Delete the instance, or mark it as deleted, or whatever you need to do. """ + # note, we don't use self.Session here, in case we're being called from + # a separate (bulk-delete) thread + session = orm.object_session(instance) + session.delete(instance) + # Flush immediately to force any pending integrity errors etc.; that # way we don't set flash message until we know we have success. - self.Session.delete(instance) - self.Session.flush() + session.flush() def get_after_delete_url(self, instance): """ diff --git a/tailbone/views/people.py b/tailbone/views/people.py index 88612d97..2173be83 100644 --- a/tailbone/views/people.py +++ b/tailbone/views/people.py @@ -51,6 +51,7 @@ class PeopleView(MasterView): touchable = True has_versions = True supports_mobile = True + bulk_deletable = True manage_notes_from_profile_view = False grid_columns = [ @@ -146,6 +147,25 @@ class PeopleView(MasterView): return not bool(person.user and person.user.username == 'chuck') return True + def delete_instance(self, person): + """ + Supplements the default logic as follows: + + Any customer associations are first deleted for the person. Once that + is complete, deletion continues as per usual. + """ + session = orm.object_session(person) + + # must explicitly remove all CustomerPerson records + for cp in list(person._customers): + customer = cp.customer + session.delete(cp) + # session.flush() + customer._people.reorder() + + # continue with normal logic + super(PeopleView, self).delete_instance(person) + def touch_instance(self, person): """ Supplements the default logic as follows: