Bugzilla – Attachment 41157 Details for
Bug 14539
Introduction to castToObject(), aka. make a Koha::Object from various input types
Home
|
New
|
Browse
|
Search
|
[?]
|
Reports
|
Help
|
New Account
|
Log In
[x]
|
Forgot Password
Login:
[x]
[patch]
Bug 14539 - Introduction to castToObject(), aka. make a Koha::Object from various input types
Bug-14539---Introduction-to-castToObject-aka-make-.patch (text/plain), 7.03 KB, created by
Olli-Antti Kivilahti
on 2015-07-24 14:03:30 UTC
(
hide
)
Description:
Bug 14539 - Introduction to castToObject(), aka. make a Koha::Object from various input types
Filename:
MIME Type:
Creator:
Olli-Antti Kivilahti
Created:
2015-07-24 14:03:30 UTC
Size:
7.03 KB
patch
obsolete
>From bebaa27d317f635be6735a5eafa9b4838c7f60ce Mon Sep 17 00:00:00 2001 >From: Olli-Antti Kivilahti <olli-antti.kivilahti@jns.fi> >Date: Tue, 14 Jul 2015 15:01:04 +0000 >Subject: [PATCH] Bug 14539 - Introduction to castToObject(), aka. make a > Koha::Object from various input types > >Finds a Borrower-object from various different types of inputs. > >Currently Koha is like an archeological dig site, we have different layers of >dealing with various business objects. > >We started with DBI and numerous ways of passing an HASH around. There is no >telling if it will be a List of column => values, or a reference to HASH, or a >HASH or just any of the business object's (eg. Borrower's) unique identifiers >(userid, cardnumber, borrowernumber). > >Then DBIx came to the rescue and now we are need to learn DBI and DBIx and SQL >to do DB operatons in Koha. Migration to DBIx is on the way. > >Finally we have Koha::Object and subclasses, which include and use the DBIx, >but those are not directly compatible, since Koha::Object is not a subclass of >DBIx::Class making life occasionally miserable. >Now we need to know 3 methods of DB accession. > >I am really frustrated with all of those different layers of history, and >making things work nicely across all different programming patterns, I have >had great success in using a casting system, where we take any value and try >to make a Koha::Object-subclass out of it. > >So we try to cast a Scalar or a reference of Koha::Object-implementation or >DBIx::ResultSet or HASH, to the desired Koha::Object-implementation. >This is a nice validation/entry function in any subroutine dealing with >business objects, making sure that we always have the "correct" implementation >of the same business object. >--- > Koha/AuthUtils.pm | 39 +++++++++++++++++++++++++++++++ > Koha/Borrowers.pm | 70 ++++++++++++++++++++++++++++++++++++++++++++++++++++++- > 2 files changed, 108 insertions(+), 1 deletion(-) > >diff --git a/Koha/AuthUtils.pm b/Koha/AuthUtils.pm >index b748c1b..5fa0afb 100644 >--- a/Koha/AuthUtils.pm >+++ b/Koha/AuthUtils.pm >@@ -22,6 +22,8 @@ use Crypt::Eksblowfish::Bcrypt qw(bcrypt en_base64); > use Encode qw( encode is_utf8 ); > use Fcntl qw/O_RDONLY/; # O_RDONLY is used in generate_salt > >+use Koha::Borrower; >+ > use base 'Exporter'; > > our $VERSION = '1.01'; >@@ -133,6 +135,43 @@ sub generate_salt { > close SOURCE; > return $string; > } >+ >+=head checkKohaSuperuserFromUserid >+See checkKohaSuperuser(), with only the "user identifier"-@PARAM. >+@THROWS nothing. >+=cut >+ >+sub checkKohaSuperuserFromUserid { >+ my ($userid) = @_; >+ >+ if ( $userid && $userid eq C4::Context->config('user') ) { >+ return _createTemporarySuperuser(); >+ } >+} >+ >+=head _createTemporarySuperuser >+ >+Create a temporary superuser which should be instantiated only to the environment >+and then discarded. So do not ->store() it! >+@RETURN Koha::Borrower >+=cut >+ >+sub _createTemporarySuperuser { >+ my $borrower = Koha::Borrower->new(); >+ >+ my $superuserName = C4::Context->config('user'); >+ $borrower->set({borrowernumber => 0, >+ userid => $superuserName, >+ cardnumber => $superuserName, >+ firstname => $superuserName, >+ surname => $superuserName, >+ branchcode => 'NO_LIBRARY_SET', >+ flags => 1, >+ email => C4::Context->preference('KohaAdminEmailAddress') >+ }); >+ return $borrower; >+} >+ > 1; > > __END__ >diff --git a/Koha/Borrowers.pm b/Koha/Borrowers.pm >index 9fb01f0..a581962 100644 >--- a/Koha/Borrowers.pm >+++ b/Koha/Borrowers.pm >@@ -18,11 +18,12 @@ package Koha::Borrowers; > # 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. > > use Modern::Perl; >+use Scalar::Util qw(blessed); > > use Carp; > > use Koha::Database; >- >+use Koha::AuthUtils; > use Koha::Borrower; > > use base qw(Koha::Objects); >@@ -49,6 +50,73 @@ sub object_class { > return 'Koha::Borrower'; > } > >+=head castToBorrower >+ >+ my $borrower = Koha::Borrowers::castToBorrower('cardnumber'); >+ my $borrower = Koha::Borrowers::castToBorrower($Koha::Borrower); >+ my $borrower = Koha::Borrowers::castToBorrower('userid'); >+ my $borrower = Koha::Borrowers::castToBorrower('borrowernumber'); >+ my $borrower = Koha::Borrowers::castToBorrower({borrowernumber => 123, >+ }); >+ my $borrower = Koha::Borrowers::castToBorrower({firstname => 'Olli-Antti', >+ surname => 'Kivi', >+ address => 'Koskikatu 25', >+ }); >+ >+Because there are gazillion million ways in Koha to invoke a Borrower, this is a >+omnibus for easily creating a Borrower-object from all the arcane invocations present >+in many parts of Koha. >+Just throw the crazy and unpredictable return values from myriad subroutines returning >+some kind of an borrowerish value to this casting function to get a brand new Koha::Borrower. >+@PARAM1 Scalar, or HASHRef. >+@RETURNS Koha::Borrower, possibly already in DB or a completely new one if nothing was >+ inferred from the DB. >+@THROWS Koha::Exception::BadParameter, if no idea what to do with the input. >+@THROWS Koha::Exception::UnknownObject, if we cannot find a Borrower with the given input. >+=cut >+ >+sub castToBorrower { >+ my ($input) = @_; >+ >+ unless ($input) { >+ Koha::Exception::BadParameter->throw(error => __PACKAGE__."::castToBorrower():> No parameter given!"); >+ } >+ if (blessed($input) && $input->isa('Koha::Borrower')) { >+ return $input; >+ } >+ if (blessed($input) && $input->isa('Koha::Schema::Result::Borrower')) { >+ return Koha::Borrower->_new_from_dbic($input); >+ } >+ >+ my ($borrowernumber, $cardnumber, $userid, $borrower); >+ #Extract unique keys and try to get the borrower from them. >+ if (ref($input) eq 'HASH') { >+ $borrowernumber = $input->{borrowernumber}; >+ $cardnumber = $input->{cardnumber}; >+ $userid = $input->{userid}; >+ } >+ elsif (not(ref($input))) { #We have a scalar >+ $borrowernumber = $input; >+ $cardnumber = $input; >+ $userid = $input; >+ } >+ if ($borrowernumber || $cardnumber || $userid) { >+ $borrower = Koha::Borrowers->search({'-or' => [{borrowernumber => $borrowernumber}, >+ {cardnumber => $cardnumber}, >+ {userid => $userid}, >+ ] >+ })->next(); >+ unless ($borrower) { >+ $borrower = Koha::AuthUtils::checkKohaSuperuserFromUserid($userid); >+ unless ($borrower) { >+ Koha::Exception::UnknownObject->throw(error => "Koha::Borrower::castToBorrower->new():> Cannot find an existing Borrower from borrowernumber|cardnumber|userid '$borrowernumber|$cardnumber|$userid'."); >+ } >+ } >+ } >+ >+ return $borrower; >+} >+ > =head1 AUTHOR > > Kyle M Hall <kyle@bywatersolutions.com> >-- >1.9.1
You cannot view the attachment while viewing its details because your browser does not support IFRAMEs.
View the attachment on a separate page
.
View Attachment As Diff
View Attachment As Raw
Actions:
View
|
Diff
|
Splinter Review
Attachments on
bug 14539
:
41025
|
41063
|
41122
|
41157
|
41250
|
41530
|
63235
|
63236
|
63237
|
63243
|
63246