Add and use a patron search that overrides opt-in invisibility
authorDan Scott <dscott@laurentian.ca>
Wed, 14 Sep 2011 20:02:14 +0000 (16:02 -0400)
committerDan Scott <dscott@laurentian.ca>
Tue, 7 May 2013 18:56:48 +0000 (14:56 -0400)
Something like this is required for API calls that need to operate
against a number of libraries in a given instance that are using opt-in;
otherwise, attempts to search for users will fail and you may end up
creating near-duplicates etc.

The implementation adds an
open-ils.actor.search.patron.advanced.opt_in_override method to
open-ils.actor, which, if invoked, checks to see if the caller has the
OPT_IN_OVERRIDE permission. If so, then the crazy_search ignores the
normal opt-in limits and searches all pertinent users in the database.

As a global permission, OPT_IN_OVERRIDE is a blunt instrument. Others
might want to put together a more refined version that uses OU depths to
define boundaries.

Signed-off-by: Dan Scott <dscott@laurentian.ca>
Conflicts:
Open-ILS/src/perlmods/lib/OpenILS/Application/Actor.pm
Open-ILS/src/perlmods/lib/OpenILS/Application/Storage/Publisher/actor.pm

Open-ILS/src/perlmods/lib/OpenILS/Application/Actor.pm
Open-ILS/src/perlmods/lib/OpenILS/Application/Storage/Publisher/actor.pm

index d818454..6ab7a14 100644 (file)
@@ -1317,21 +1317,33 @@ __PACKAGE__->register_method(
     method   => "patron_adv_search",
     api_name => "open-ils.actor.patron.search.advanced"
 );
+__PACKAGE__->register_method(
+    method   => "patron_adv_search",
+    api_name => "open-ils.actor.patron.search.advanced.opt_in_override"
+);
 sub patron_adv_search {
        my( $self, $client, $auth, $search_hash, 
         $search_limit, $search_sort, $include_inactive, $search_ou ) = @_;
 
+    my $ignore_opt_in = 0;
        my $e = new_editor(authtoken=>$auth);
        return $e->event unless $e->checkauth;
        return $e->event unless $e->allowed('VIEW_USER');
 
+    # Override opt-in permissions
+    if ($self->api_name =~ /opt_in_override/) {
+        if ($e->allowed('OPT_IN_OVERRIDE')) {
+            $ignore_opt_in = 1;
+        }
+    }
+
        # depth boundary outside of which patrons must opt-in, default to 0
        my $opt_boundary = 0;
        $opt_boundary = $U->ou_ancestor_setting_value($e->requestor->ws_ou,'org.patron_opt_boundary') if user_opt_in_enabled($self);
 
        return $U->storagereq(
                "open-ils.storage.actor.user.crazy_search", $search_hash, 
-            $search_limit, $search_sort, $include_inactive, $e->requestor->ws_ou, $search_ou, $opt_boundary);
+            $search_limit, $search_sort, $include_inactive, $e->requestor->ws_ou, $search_ou, $opt_boundary, $ignore_opt_in);
 }
 
 
index b0c9af2..ce28344 100644 (file)
@@ -642,6 +642,7 @@ sub patron_search {
        my $ws_ou = shift;
        my $search_org = shift || $ws_ou;
        my $opt_boundary = shift || 0;
+       my $opt_in_override = shift;
 
     my $penalty_sort = 0;
 
@@ -762,7 +763,7 @@ sub patron_search {
        my $descendants = "actor.org_unit_descendants($search_org)";
 
        my $opt_in_where = '';
-       if (lc($strict_opt_in) eq 'true') {
+       if (lc($strict_opt_in) eq 'true' && (!$opt_in_override)) {
                $opt_in_where = "AND (";
                $opt_in_where .= "EXISTS (select id FROM $opt_in_table ";
                $opt_in_where .= " WHERE org_unit in (select (actor.org_unit_ancestors($ws_ou)).id)";