LP 1889628: SIP2 Patron Username Lookup
authorJason Stephenson <jason@sigio.com>
Wed, 12 Aug 2020 18:44:00 +0000 (14:44 -0400)
committerJason Stephenson <jason@sigio.com>
Wed, 12 Aug 2020 18:44:00 +0000 (14:44 -0400)
Allow SIP2 clients to pass the username or barcode in the SIP2 Patron
Identifier field (AA).

To make this possible, we modify the OpenILS::SIP::Patron->new method
to accept a usrname key to retrieve patrons by usrname.

We also modify the OpenILS::SIP->find_patron method to accept a
usrname key to look up patrons.  The find_partron method is further
modified to check the patron id against the opac.barcode.regex in more or
less the same manner as the OPAC.

Two helper functions are added to OpenILS::SIP:

1. get_ou_setting: to retrieve org unit settings using the home_ou of
the logged in SIP2 account.

2. get_barcode_regex: To retrieve and cache the opac.barcode_regex
setting.

Signed-off-by: Jason Stephenson <jason@sigio.com>
Open-ILS/src/perlmods/lib/OpenILS/SIP.pm
Open-ILS/src/perlmods/lib/OpenILS/SIP/Patron.pm

index 500efa2..ad1a502 100644 (file)
@@ -241,16 +241,39 @@ sub state {
     return { authtoken => $self->{authtoken} };
 }
 
+sub get_ou_setting {
+    my $self = shift;
+    my $setting = shift;
+    my $sess = $self->fetch_session;
+    return $U->ou_ancestor_setting_value($sess->home_ou, $setting);
+}
+
+sub get_barcode_regex {
+    my $self = shift;
+    if (!defined($self->{bc_regex})) {
+        $self->{bc_regex} = Sself->get_ou_setting('opac.barcode_regex');
+        $self->{bc_regex} = '^\d' unless ($self->{bc_regex});
+    }
+    return $self->{bc_regex};
+}
+
 #
 # find_patron($barcode);
 # find_patron(barcode => $barcode);   # same as above
 # find_patron(usr => $id);
+# find_patron(usrname => $usrname);
 
 sub find_patron {
     my $self = shift;
     my $key  =  (@_ > 1) ? shift : 'barcode';  # if we have multiple args, the first is the key index (default barcode)
     my $patron_id = shift;
 
+    # Check for usrname or barcode in the same, simple way that the OPAC does.
+    my $bc_regex = $self->get_barcode_regex();
+    if ($key eq 'barcode' && $patron_id !~ /$bc_regex/) {
+        $key = 'usrname';
+    }
+
     $self->verify_session;
     return OpenILS::SIP::Patron->new($key => $patron_id, authtoken => $self->{authtoken}, @_);
 }
index 16cff51..c26d8bf 100644 (file)
@@ -36,7 +36,7 @@ sub new {
     my $patron_id = shift;
     my %args = @_;
 
-    if ($key ne 'usr' and $key ne 'barcode') {
+    if ($key ne 'usr' and $key ne 'barcode' and $key ne 'usrname') {
         syslog("LOG_ERROR", "Patron (card) lookup requested by illegeal key '$key'");
         return undef;
     }
@@ -78,7 +78,7 @@ sub new {
 
     # in some cases, we don't need all of this data.  Only fetch the user + barcode
     $usr_flesh = {flesh => 1, flesh_fields => {au => ['card']}} if $args{slim_user};
-    
+
     my $user;
     if($key eq 'barcode') { # retrieve user by barcode
 
@@ -94,6 +94,8 @@ sub new {
 
         $user = $card->usr;
 
+    } elsif ($key eq 'usrname') {
+        $user = $e->search_actor_user([{usrname => $patron_id}, $usr_flesh])->[0];
     } else {
         $user = $e->retrieve_actor_user([$patron_id, $usr_flesh]);
     }