Make Delete User failure overridable collab/phasefx/prevent_user_delete_with_open_xacts
authorJason Etheridge <jason@esilibrary.com>
Wed, 11 Jan 2012 03:15:31 +0000 (22:15 -0500)
committerJason Etheridge <jason@esilibrary.com>
Wed, 11 Jan 2012 03:18:25 +0000 (22:18 -0500)
Make mrpeter's new ACTOR_USER_DELETE_OPEN_XACTS event overridable to preserve
existing functionality (the delete user code will wipe out all transactions if
allowed to, and will leave copy statuses as "Checked Out" if needed, which is
okay in EG even if there aren't corresponding circ records--some libraries
migrate data like this if the information available is sparse).

So if you want to be able to do this without a super user, you'll need to create
an ACTOR_USER_DELETE_OPEN_XACTS.override perm and assign it to perm groups
and/or users.

Signed-off-by: Jason Etheridge <jason@esilibrary.com>
Open-ILS/src/perlmods/lib/OpenILS/Application/Actor.pm
Open-ILS/xul/staff_client/server/locale/en-US/patron.properties
Open-ILS/xul/staff_client/server/patron/display.js

index 895fc29..9023ef0 100644 (file)
@@ -3507,6 +3507,12 @@ sub update_events {
 
 __PACKAGE__->register_method (
        method          => 'really_delete_user',
+       api_name    => 'open-ils.actor.user.delete.override',
+    signature   => q/@see open-ils.actor.user.delete/
+);
+
+__PACKAGE__->register_method (
+       method          => 'really_delete_user',
        api_name    => 'open-ils.actor.user.delete',
     signature   => q/
         It anonymizes all personally identifiable information in actor.usr. By calling actor.usr_purge_data() 
@@ -3533,8 +3539,12 @@ sub really_delete_user {
 
     my $user = $e->retrieve_actor_user($user_id) or return $e->die_event;
 
-    # No deleting patrons with open billings or checked out copies
-    return $e->die_event(OpenILS::Event->new('ACTOR_USER_DELETE_OPEN_XACTS')) if @$open_bills;
+    # No deleting patrons with open billings or checked out copies, unless perm-enabled override
+    if (@$open_bills) {
+        return $e->die_event(OpenILS::Event->new('ACTOR_USER_DELETE_OPEN_XACTS'))
+        unless $self->api_name =~ /override/o
+        && $e->allowed('ACTOR_USER_DELETE_OPEN_XACTS.override', $user->home_ou);
+    }
     # No deleting yourself - UI is supposed to stop you first, though.
     return $e->die_event unless $e->requestor->id != $user->id;
     return $e->die_event unless $e->allowed('DELETE_USER', $user->home_ou);
index 3bd00ce..bd55f59 100644 (file)
@@ -94,7 +94,7 @@ staff.patron.display.cmd_patron_delete.dest_user.default_value=
 staff.patron.display.cmd_patron_delete.dest_user.title=Destination User
 staff.patron.display.cmd_patron_delete.dest_user.failure=Failed to retrieve destination user.  User deletion aborted.
 staff.patron.display.cmd_patron_delete.dest_user.self_reference_failure=Cannot specify the deleted user as the destination user.  User deletion aborted.
-staff.patron.display.cmd_patron_delete.open_xact=The user you have attempted to delete cannot be deleted because it has open circulations and/or unpaid bills.
+staff.patron.display.cmd_patron_delete.override_prompt=Override patron deletion failure?
 staff.patron.display.spawn_editor.editing_related_patron=Editing Related Patron
 staff.patron.display.init.retrieving_patron=Retrieving Patron...
 staff.patron.display.init.retrieving=Retrieving...
index f4da6f2..97f23c0 100644 (file)
@@ -123,12 +123,21 @@ patron.display.prototype = {
                                         }
                                         params.push( dest_usr.id() );
                                     }
-                                    var robj = obj.network.simple_request( 'FM_AU_DELETE', params );
-                                    alert(js2JSON(robj));
+                                    var robj = obj.network.simple_request(
+                                        'FM_AU_DELETE',
+                                        params,
+                                        null,
+                                        {
+                                            'title' : document.getElementById('patronStrings').getString('staff.patron.display.cmd_patron_delete.override_prompt'),
+                                            'overridable_events' : [
+                                                2004 /* ACTOR_USER_DELETE_OPEN_XACTS */
+                                            ]
+                                        }
+                                    );
                                     if (typeof robj.ilsevent != 'undefined') {
                                         switch(Number(robj.ilsevent)) {
+                                            /* already informed via override prompt */
                                             case 2004 /* ACTOR_USER_DELETE_OPEN_XACTS */ :
-                                                alert(document.getElementById('patronStrings').getString('staff.patron.display.cmd_patron_delete.open_xact'));
                                                 return;
                                             break;
                                         }