From bf5f945d81df3c388308625b327794479965cf6b Mon Sep 17 00:00:00 2001 From: Srdjan Date: Fri, 23 Sep 2016 18:08:30 +1200 Subject: [PATCH] Bug 17602 Add OneClickDigital Integration to Koha Koha::ExternalContent::OneClickDigital - a wrapper around WebService::ILS::OneClickDigital::PartnerPatron OneClickDigital* sysprefs Nothing functional to test with this patch yet. But you can run the tests that come with it t/db_dependent/Koha_ExternalContent_OneClickDigital.t Signed-off-by: Nick Clemens --- C4/Installer/PerlDependencies.pm | 2 +- Koha/ExternalContent/OneClickDigital.pm | 106 +++++++++++++++++++++ .../data/mysql/atomicupdate/oneclickdigital.sql | 4 + installer/data/mysql/sysprefs.sql | 3 + .../admin/preferences/enhanced_content.pref | 12 +++ .../Koha_ExternalContent_OneClickDigital.t | 55 +++++++++++ 6 files changed, 181 insertions(+), 1 deletion(-) create mode 100644 Koha/ExternalContent/OneClickDigital.pm create mode 100644 installer/data/mysql/atomicupdate/oneclickdigital.sql create mode 100755 t/db_dependent/Koha_ExternalContent_OneClickDigital.t diff --git a/C4/Installer/PerlDependencies.pm b/C4/Installer/PerlDependencies.pm index c4f5409..5fa5ffe 100644 --- a/C4/Installer/PerlDependencies.pm +++ b/C4/Installer/PerlDependencies.pm @@ -860,7 +860,7 @@ our $PERL_DEPS = { 'WebService::ILS' => { 'usage' => 'Interface third party systems', 'required' => '0', - 'min_ver' => '0.07', + 'min_ver' => '0.14', }, }; diff --git a/Koha/ExternalContent/OneClickDigital.pm b/Koha/ExternalContent/OneClickDigital.pm new file mode 100644 index 0000000..686b919 --- /dev/null +++ b/Koha/ExternalContent/OneClickDigital.pm @@ -0,0 +1,106 @@ +# Copyright 2016 Catalyst +# +# This file is part of Koha. +# +# Koha is free software; you can redistribute it and/or modify it under the +# terms of the GNU General Public License as published by the Free Software +# Foundation; either version 3 of the License, or (at your option) any later +# version. +# +# Koha is distributed in the hope that it will be useful, but WITHOUT ANY +# WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR +# A PARTICULAR PURPOSE. See the GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License along +# with Koha; if not, write to the Free Software Foundation, Inc., +# 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. + +package Koha::ExternalContent::OneClickDigital; + +use Modern::Perl; +use Carp; + +use base qw(Koha::ExternalContent); +use WebService::ILS::OneClickDigital::PartnerPatron; +use WebService::ILS::OneClickDigital::Partner; +use C4::Context; +use Koha::Logger; + +use constant logger => Koha::Logger->get(); + +__PACKAGE__->mk_accessors(qw(domain is_identified)); + +=head1 NAME + +Koha::ExternalContent::OneClickDigital + +=head1 SYNOPSIS + + use Koha::ExternalContent::OneClickDigital; + my $od_client = Koha::ExternalContent::OneClickDigital->new(); + my $od_auth_url = $od_client->auth_url(); + +=head1 DESCRIPTION + +A (very) thin wrapper around C + +Takes "OneClickDigital*" Koha preferences + +=cut + +sub new { + my $class = shift; + my $params = shift || {}; + + my $self = $class->SUPER::new($params); + unless ($params->{client}) { + my $client_secret = C4::Context->preference('OneClickDigitalClientSecret') + or croak("OneClickDigitalClientSecret pref not set"); + my $library_id = C4::Context->preference('OneClickDigitalLibraryID') + or croak("OneClickDigitalLibraryID pref not set"); + my $domain = C4::Context->preference('OneClickDigitalDomain'); + my $patron = $params->{koha_session_id} ? $self->koha_patron : undef; + my $client; + if ($patron) { + local $@; + $client = eval { WebService::ILS::OneClickDigital::PartnerPatron->new( + client_secret => $client_secret, + library_id => $library_id, + domain => $domain, + user_id => $patron->email, + user_agent_params => { agent => $class->agent_string } + ) }; + $self->logger->warn("Invalid OneClickDigital user ".$patron->email." ($@)") if $@; + $self->is_identified($client); + } + $client ||= WebService::ILS::OneClickDigital::Partner->new( + client_secret => $client_secret, + library_id => $library_id, + domain => $domain, + ); + $self->client( $client ); + } + return $self; +} + +=head1 METHODS + +L methods used without mods: + +=over 4 + +=item C + +=back + +=cut + +use vars qw{$AUTOLOAD}; +sub AUTOLOAD { + my $self = shift; + (my $method = $AUTOLOAD) =~ s/.*:://; + return $self->client->$method(@_); +} +sub DESTROY { } + +1; diff --git a/installer/data/mysql/atomicupdate/oneclickdigital.sql b/installer/data/mysql/atomicupdate/oneclickdigital.sql new file mode 100644 index 0000000..18ed745 --- /dev/null +++ b/installer/data/mysql/atomicupdate/oneclickdigital.sql @@ -0,0 +1,4 @@ +INSERT IGNORE INTO systempreferences (variable,value,options,explanation,type) +VALUES ('OneClickDigitalClientSecret','','30','Client key for OneClickDigital integration','YesNo'), + ('OneClickDigitalLibraryID','','','Library ID for OneClickDigital integration','Integer'), + ('OneClickDigitalDomain','','','OneClickDigital domain','Free'); diff --git a/installer/data/mysql/sysprefs.sql b/installer/data/mysql/sysprefs.sql index 0bd8cac..dcedfe4 100644 --- a/installer/data/mysql/sysprefs.sql +++ b/installer/data/mysql/sysprefs.sql @@ -202,6 +202,9 @@ INSERT INTO systempreferences ( `variable`, `value`, `options`, `explanation`, ` ('IndependentBranches','0',NULL,'If ON, increases security between libraries','YesNo'), ('IndependentBranchesPatronModifications','0', NULL, 'Show only modification request for the logged in branch','YesNo'), ('IntranetCatalogSearchPulldown','0', NULL, 'Show a search field pulldown for \"Search the catalog\" boxes','YesNo'), +('OneClickDigitalClientSecret','','30','Client key for OneClickDigital integration','YesNo'), +('OneClickDigitalDomain','','','OneClickDigital domain','Free'), +('OneClickDigitalLibraryID','','','Library ID for OneClickDigital integration','Integer'), ('OnSiteCheckouts','0','','Enable/Disable the on-site checkouts feature','YesNo'), ('OnSiteCheckoutsForce','0','','Enable/Disable the on-site for all cases (Even if a user is debarred, etc.)','YesNo'), ('InProcessingToShelvingCart','0','','If set, when any item with a location code of PROC is \'checked in\', it\'s location code will be changed to CART.','YesNo'), diff --git a/koha-tmpl/intranet-tmpl/prog/en/modules/admin/preferences/enhanced_content.pref b/koha-tmpl/intranet-tmpl/prog/en/modules/admin/preferences/enhanced_content.pref index f62882d..736f1da 100644 --- a/koha-tmpl/intranet-tmpl/prog/en/modules/admin/preferences/enhanced_content.pref +++ b/koha-tmpl/intranet-tmpl/prog/en/modules/admin/preferences/enhanced_content.pref @@ -372,6 +372,18 @@ Enhanced Content: - If you enable access, you must register auth return url of - http(s)://my.opac.hostname/cgi-bin/koha/external/overdrive/auth.pl - with OverDrive. + OneClickDigital: + - + - Include OneClickDigital availability information with the client secret + - pref: OneClickDigitalClientSecret + - . + - + - "Show items from the OneClickDigital catalog of library #" + - pref: OneClickDigitalLibraryID + - . + - + - OneClickDigital domain + - pref: OneClickDigitalDomain Coce Cover images cache: - - pref: Coce diff --git a/t/db_dependent/Koha_ExternalContent_OneClickDigital.t b/t/db_dependent/Koha_ExternalContent_OneClickDigital.t new file mode 100755 index 0000000..bff841b --- /dev/null +++ b/t/db_dependent/Koha_ExternalContent_OneClickDigital.t @@ -0,0 +1,55 @@ +use Modern::Perl; + +use t::lib::Mocks; +use t::lib::TestBuilder; +use Test::More tests => 3; # last test to print +use C4::Auth; +use Koha::Database; + +use Module::Load::Conditional qw( can_load ); +SKIP: { + skip "cannot filnd WebService::ILS::OneClickDigital::PartnerPatron", 3 + unless can_load( modules => {'WebService::ILS::OneClickDigital::PartnerPatron' => undef} ); + + use_ok('Koha::ExternalContent::OneClickDigital'); + + my $ocd_user_email = $ENV{ONECLICKDIGITAL_TEST_USER_EMAIL}; + SKIP: { + skip "Env ONECLICKDIGITAL_TEST_USER_EMAIL not set", 2 unless $ocd_user_email; + + my $ocd_secret = $ENV{ONECLICKDIGITAL_TEST_CLIENT_SECRET} + || C4::Context->preference('OneClickDigitalClientSecret'); + my $ocd_library_id = $ENV{ONECLICKDIGITAL_TEST_LIBRARY_ID} + || C4::Context->preference('OneClickDigitalLibraryID'); + my $ocd_domain = $ENV{ONECLICKDIGITAL_TEST_DOMAIN} + || C4::Context->preference('OneClickDigitalDomain'); + skip "Env ONECLICKDIGITAL_TEST_CLIENT_SECRET ONECLICKDIGITAL_TEST_LIBRARY_ID ONECLICKDIGITAL_TEST_DOMAIN not set", 2 + unless $ocd_secret && $ocd_library_id && $ocd_domain; + + my $schema = Koha::Database->schema; + $schema->storage->txn_begin; + my $builder = t::lib::TestBuilder->new(); + + t::lib::Mocks::mock_preference('OneClickDigitalClientSecret', $ocd_secret); + t::lib::Mocks::mock_preference('OneClickDigitalLibraryID', $ocd_library_id); + t::lib::Mocks::mock_preference('OneClickDigitalDomain', $ocd_domain); + + my $patron = $builder->build({ + source => 'Borrower', + value => { + email => $ocd_user_email, + } + }); + + my $session = C4::Auth::get_session(""); + $session->param('number', $patron->{borrowernumber}); + $session->flush; + my $client = Koha::ExternalContent::OneClickDigital->new({koha_session_id => $session->id}); + + my $user_agent_string = $client->user_agent->agent(); + ok ($user_agent_string =~ m/^Koha/, 'User Agent string is set') + or diag("User Agent string: $user_agent_string"); + + ok ($client->search({query => "school"}), 'search()'); + } +} -- 2.1.4