Bug 10636 - patronimage should have borrowernumber as PK, not cardnumber

Test Plan:
1) Apply this patch
2) Run updatedatabase.pl
3) Enable patronimages
4) Verify patron images are still displaying correctly
5) Test deleting a patron image
6) Test adding a patron image from moremember.pl
7) Test adding a patron image from tools/picture-upload.pl

Signed-off-by: Srdjan <srdjan@catalyst.net.nz>
Signed-off-by: Galen Charlton <gmc@esilibrary.com>
This commit is contained in:
Kyle M Hall 2013-08-29 12:23:39 -04:00 committed by Galen Charlton
parent 398b9dfdbd
commit 09b8ce2a5f
30 changed files with 97 additions and 53 deletions

View File

@ -1921,19 +1921,19 @@ sub GetTitles {
=head2 GetPatronImage
my ($imagedata, $dberror) = GetPatronImage($cardnumber);
my ($imagedata, $dberror) = GetPatronImage($borrowernumber);
Returns the mimetype and binary image data of the image for the patron with the supplied cardnumber.
Returns the mimetype and binary image data of the image for the patron with the supplied borrowernumber.
=cut
sub GetPatronImage {
my ($cardnumber) = @_;
warn "Cardnumber passed to GetPatronImage is $cardnumber" if $debug;
my ($borrowernumber) = @_;
warn "Borrowernumber passed to GetPatronImage is $borrowernumber" if $debug;
my $dbh = C4::Context->dbh;
my $query = 'SELECT mimetype, imagefile FROM patronimage WHERE cardnumber = ?';
my $query = 'SELECT mimetype, imagefile FROM patronimage WHERE borrowernumber = ?';
my $sth = $dbh->prepare($query);
$sth->execute($cardnumber);
$sth->execute($borrowernumber);
my $imagedata = $sth->fetchrow_hashref;
warn "Database error!" if $sth->errstr;
return $imagedata, $sth->errstr;
@ -1952,7 +1952,7 @@ sub PutPatronImage {
my ($cardnumber, $mimetype, $imgfile) = @_;
warn "Parameters passed in: Cardnumber=$cardnumber, Mimetype=$mimetype, " . ($imgfile ? "Imagefile" : "No Imagefile") if $debug;
my $dbh = C4::Context->dbh;
my $query = "INSERT INTO patronimage (cardnumber, mimetype, imagefile) VALUES (?,?,?) ON DUPLICATE KEY UPDATE imagefile = ?;";
my $query = "INSERT INTO patronimage (borrowernumber, mimetype, imagefile) VALUES ( ( SELECT borrowernumber from borrowers WHERE cardnumber = ? ),?,?) ON DUPLICATE KEY UPDATE imagefile = ?;";
my $sth = $dbh->prepare($query);
$sth->execute($cardnumber,$mimetype,$imgfile,$imgfile);
warn "Error returned inserting $cardnumber.$mimetype." if $sth->errstr;
@ -1961,19 +1961,19 @@ sub PutPatronImage {
=head2 RmPatronImage
my ($dberror) = RmPatronImage($cardnumber);
my ($dberror) = RmPatronImage($borrowernumber);
Removes the image for the patron with the supplied cardnumber.
Removes the image for the patron with the supplied borrowernumber.
=cut
sub RmPatronImage {
my ($cardnumber) = @_;
warn "Cardnumber passed to GetPatronImage is $cardnumber" if $debug;
my ($borrowernumber) = @_;
warn "Borrowernumber passed to GetPatronImage is $borrowernumber" if $debug;
my $dbh = C4::Context->dbh;
my $query = "DELETE FROM patronimage WHERE cardnumber = ?;";
my $query = "DELETE FROM patronimage WHERE borrowernumber = ?;";
my $sth = $dbh->prepare($query);
$sth->execute($cardnumber);
$sth->execute($borrowernumber);
my $dberror = $sth->errstr;
warn "Database error!" if $sth->errstr;
return $dberror;

View File

@ -765,7 +765,7 @@ if ($stickyduedate) {
$session->param( 'stickyduedate', $duedatespec );
}
my ($picture, $dberror) = GetPatronImage($borrower->{'cardnumber'});
my ($picture, $dberror) = GetPatronImage($borrower->{'borrowernumber'});
$template->param( picture => 1 ) if $picture;
# get authorised values with type of BOR_NOTES

View File

@ -1665,11 +1665,11 @@ CREATE TABLE `patroncards` (
DROP TABLE IF EXISTS `patronimage`;
CREATE TABLE `patronimage` ( -- information related to patron images
`cardnumber` varchar(16) NOT NULL, -- the cardnumber of the patron this image is attached to (borrowers.cardnumber)
`borrowernumber` int(11) NOT NULL, -- the borrowernumber of the patron this image is attached to (borrowers.borrowernumber)
`mimetype` varchar(15) NOT NULL, -- the format of the image (png, jpg, etc)
`imagefile` mediumblob NOT NULL, -- the image
PRIMARY KEY (`cardnumber`),
CONSTRAINT `patronimage_fk1` FOREIGN KEY (`cardnumber`) REFERENCES `borrowers` (`cardnumber`) ON DELETE CASCADE ON UPDATE CASCADE
PRIMARY KEY (`borrowernumber`),
CONSTRAINT `patronimage_fk1` FOREIGN KEY (`borrowernumber`) REFERENCES `borrowers` (`borrowernumber`) ON DELETE CASCADE ON UPDATE CASCADE
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
-- Table structure for table `pending_offline_operations`

View File

@ -7216,6 +7216,51 @@ if ( CheckVersion($DBversion) ) {
SetVersion($DBversion);
}
$DBversion = "3.13.00.XXX";
if ( CheckVersion($DBversion) ) {
$dbh->do(qq{
DELETE FROM patronimage WHERE NOT EXISTS (SELECT * FROM borrowers WHERE borrowers.cardnumber = patronimage.cardnumber)
});
$dbh->do(qq{
ALTER TABLE patronimage ADD borrowernumber INT( 11 ) NULL FIRST
});
$dbh->{AutoCommit} = 0;
$dbh->{RaiseError} = 1;
eval {
$dbh->do(qq{
UPDATE patronimage LEFT JOIN borrowers USING ( cardnumber ) SET patronimage.borrowernumber = borrowers.borrowernumber
});
$dbh->commit();
};
if ($@) {
print "Upgrade to $DBversion done (Bug 10636 - patronimage should have borrowernumber as PK, not cardnumber) failed! Transaction aborted because $@\n";
eval { $dbh->rollback };
}
else {
$dbh->do(qq{
ALTER TABLE patronimage DROP FOREIGN KEY patronimage_fk1
});
$dbh->do(qq{
ALTER TABLE patronimage DROP PRIMARY KEY, ADD PRIMARY KEY( borrowernumber )
});
$dbh->do(qq{
ALTER TABLE patronimage DROP cardnumber
});
$dbh->do(qq{
ALTER TABLE patronimage ADD FOREIGN KEY ( borrowernumber ) REFERENCES borrowers ( borrowernumber ) ON DELETE CASCADE ON UPDATE CASCADE
});
print "Upgrade to $DBversion done (Bug 10636 - patronimage should have borrowernumber as PK, not cardnumber)\n";
SetVersion($DBversion);
}
$dbh->{AutoCommit} = 1;
$dbh->{RaiseError} = 0;
}
=head1 FUNCTIONS

View File

@ -7,7 +7,7 @@
<ul class="patronbriefinfo">
[% IF ( patronimages ) %]
[% IF ( picture ) %]
<li><img src="/cgi-bin/koha/members/patronimage.pl?crdnum=[% cardnumber | uri %]" id="patronimage" alt="[% firstname %] [% surname %] ([% cardnumber %])" border="0" style="max-width : 140px; margin: .3em 0 .3em .3em; padding: .2em; border: 1px solid #CCCCCC; width:auto !important; width:130px;" /></li>
<li><img src="/cgi-bin/koha/members/patronimage.pl?borrowernumber=[% borrowernumber | uri %]" id="patronimage" alt="[% firstname %] [% surname %] ([% cardnumber %])" border="0" style="max-width : 140px; margin: .3em 0 .3em .3em; padding: .2em; border: 1px solid #CCCCCC; width:auto !important; width:130px;" /></li>
[% ELSE %]
<li id="patronbasics"><img src="[% interface %]/[% theme %]/img/patron-blank.png" alt="[% firstname %] [% surname %] ([% cardnumber %])" border="0" style="margin: .3em 0 .3em .3em; padding: .2em; border: 1px solid #CCCCCC;" /></li>
[% END %]

View File

@ -9,7 +9,7 @@ in the global namespace %]
<ul class="patronbriefinfo">
[% IF ( patronimages ) %]
[% IF borrower.has_picture %]
<li><img src="/cgi-bin/koha/members/patronimage.pl?crdnum=[% borrower.cardnumber %]" id="patronimage" alt="[% borrower.firstname %] [% borrower.surname %] ([% borrower.cardnumber %])" border="0" style="max-width : 140px; margin: .3em 0 .3em .3em; padding: .2em; border: 1px solid #CCCCCC; width:auto !important; width:130px;" /></li>
<li><img src="/cgi-bin/koha/members/patronimage.pl?borrowernumber=[% borrower.borrowernumber %]" id="patronimage" alt="[% borrower.firstname %] [% borrower.surname %] ([% borrower.cardnumber %])" border="0" style="max-width : 140px; margin: .3em 0 .3em .3em; padding: .2em; border: 1px solid #CCCCCC; width:auto !important; width:130px;" /></li>
[% ELSE %]
<li id="patronbasics"><img src="[% interface %]/[% theme %]/img/patron-blank.png" alt="[% borrower.firstname %] [% borrower.surname %] ([% borrower.cardnumber %])" border="0" style="margin: .3em 0 .3em .3em; padding: .2em; border: 1px solid #CCCCCC;" /></li>
[% END %]

View File

@ -92,7 +92,7 @@ foreach my $accountline ( @{$accts}) {
$template->param( adultborrower => 1 ) if ( $data->{'category_type'} eq 'A' );
my ($picture, $dberror) = GetPatronImage($data->{'cardnumber'});
my ($picture, $dberror) = GetPatronImage($data->{'borrowernumber'});
$template->param( picture => 1 ) if $picture;
if (C4::Context->preference('ExtendedPatronAttributes')) {

View File

@ -83,7 +83,7 @@ my $data=$sth->fetchrow_hashref;
if ($countissues > 0 or $flags->{'CHARGES'} or $data->{'borrowernumber'}){
# print $input->header;
my ($picture, $dberror) = GetPatronImage($bor->{'cardnumber'});
my ($picture, $dberror) = GetPatronImage($bor->{'borrowernumber'});
$template->param( picture => 1 ) if $picture;
$template->param(borrowernumber => $member,

View File

@ -115,7 +115,7 @@ else {
);
}
my ($picture, $dberror) = GetPatronImage($data->{'cardnumber'});
my ($picture, $dberror) = GetPatronImage($data->{'borrowernumber'});
$template->param( picture => 1 ) if $picture;
$template->param(

View File

@ -77,7 +77,7 @@ if ($add){
}
$template->param( adultborrower => 1 ) if ( $data->{category_type} eq 'A' );
my ($picture, $dberror) = GetPatronImage($data->{'cardnumber'});
my ($picture, $dberror) = GetPatronImage($data->{'borrowernumber'});
$template->param( picture => 1 ) if $picture;
if (C4::Context->preference('ExtendedPatronAttributes')) {

View File

@ -105,7 +105,7 @@ if ($add){
}
$template->param( adultborrower => 1 ) if ( $data->{'category_type'} eq 'A' );
my ($picture, $dberror) = GetPatronImage($data->{'cardnumber'});
my ($picture, $dberror) = GetPatronImage($data->{'borrowernumber'});
$template->param( picture => 1 ) if $picture;
if (C4::Context->preference('ExtendedPatronAttributes')) {

View File

@ -160,7 +160,7 @@ if ($input->param('newflags')) {
}
$template->param( adultborrower => 1 ) if ( $bor->{'category_type'} eq 'A' );
my ($picture, $dberror) = GetPatronImage($bor->{'cardnumber'});
my ($picture, $dberror) = GetPatronImage($bor->{'borrowernumber'});
$template->param( picture => 1 ) if $picture;
if (C4::Context->preference('ExtendedPatronAttributes')) {

View File

@ -89,7 +89,7 @@ if ( $newpassword && !scalar(@errors) ) {
}
$template->param( adultborrower => 1 ) if ( $bor->{'category_type'} eq 'A' );
my ($picture, $dberror) = GetPatronImage($bor->{'cardnumber'});
my ($picture, $dberror) = GetPatronImage($bor->{'borrowernumber'});
$template->param( picture => 1 ) if $picture;
if (C4::Context->preference('ExtendedPatronAttributes')) {

View File

@ -356,7 +356,7 @@ if($userenv->{flags} % 2 == 1){
# check to see if patron's image exists in the database
# basically this gives us a template var to condition the display of
# patronimage related interface on
my ($picture, $dberror) = GetPatronImage($data->{'cardnumber'});
my ($picture, $dberror) = GetPatronImage($data->{'borrowernumber'});
$template->param( picture => 1 ) if $picture;
my $branch=C4::Context->userenv->{'branch'};

View File

@ -47,7 +47,7 @@ my ($template, $loggedinuser, $cookie)
});
$template->param( $borrower );
my ($picture, $dberror) = GetPatronImage($borrower->{'cardnumber'});
my ($picture, $dberror) = GetPatronImage($borrower->{'borrowernumber'});
$template->param( picture => 1 ) if $picture;
# Getting the messages

View File

@ -31,7 +31,7 @@ $|=1;
my $DEBUG = 0;
my $data = new CGI;
my $cardnumber;
my $borrowernumber;
=head1 NAME
@ -39,24 +39,24 @@ patronimage.pl - Script for retrieving and formatting Koha patron images for dis
=head1 SYNOPSIS
<img src="patronimage.pl?crdnum= />
<img src="patronimage.pl?borrowernumber= />
=head1 DESCRIPTION
This script, when called from within HTML and passed a valid patron cardnumber, will retrieve the image data associated with that cardnumber if one exists, format it in proper HTML format and pass it back to be displayed.
This script, when called from within HTML and passed a valid patron borrowernumber, will retrieve the image data associated with that borrowernumber if one exists, format it in proper HTML format and pass it back to be displayed.
=cut
if ($data->param('crdnum')) {
$cardnumber = $data->param('crdnum');
if ($data->param('borrowernumber')) {
$borrowernumber = $data->param('borrowernumber');
} else {
$cardnumber = shift;
$borrowernumber = shift;
}
warn "Cardnumber passed in: $cardnumber" if $DEBUG;
warn "Borrowernumber passed in: $borrowernumber" if $DEBUG;
my ($imagedata, $dberror) = GetPatronImage($cardnumber);
my ($imagedata, $dberror) = GetPatronImage($borrowernumber);
if ($dberror) {
warn "Database Error!";
@ -70,7 +70,7 @@ if ($imagedata) {
print $data->header (-type => $imagedata->{'mimetype'}, -'Cache-Control' => 'no-store', -Content_Length => length ($imagedata->{'imagefile'})), $imagedata->{'imagefile'};
exit;
} else {
warn "No image exists for $cardnumber";
warn "No image exists for $borrowernumber";
exit;
}

View File

@ -220,7 +220,7 @@ sub borrower_add_additional_fields {
} elsif ( $b_ref->{category_type} eq 'A' ) {
$b_ref->{adultborrower} = 1;
}
my ( $picture, $dberror ) = GetPatronImage( $b_ref->{cardnumber} );
my ( $picture, $dberror ) = GetPatronImage( $b_ref->{borrowernumber} );
if ($picture) {
$b_ref->{has_picture} = 1;
}

View File

@ -169,7 +169,7 @@ sub borrower_add_additional_fields {
} elsif ( $b_ref->{category_type} eq 'A' ) {
$b_ref->{adultborrower} = 1;
}
my ( $picture, $dberror ) = GetPatronImage( $b_ref->{cardnumber} );
my ( $picture, $dberror ) = GetPatronImage( $b_ref->{borrowernumber} );
if ($picture) {
$b_ref->{has_picture} = 1;
}

View File

@ -113,7 +113,7 @@ for (my $i=0;$i<$numaccts;$i++){
$template->param( adultborrower => 1 ) if ( $data->{'category_type'} eq 'A' );
my ($picture, $dberror) = GetPatronImage($data->{'cardnumber'});
my ($picture, $dberror) = GetPatronImage($data->{'borrowernumber'});
$template->param( picture => 1 ) if $picture;
$template->param(

View File

@ -112,7 +112,7 @@ for ( my $i = 0 ; $i < $numaccts ; $i++ ) {
$template->param( adultborrower => 1 ) if ( $data->{'category_type'} eq 'A' );
my ( $picture, $dberror ) = GetPatronImage( $data->{'cardnumber'} );
my ( $picture, $dberror ) = GetPatronImage( $data->{'borrowernumber'} );
$template->param( picture => 1 ) if $picture;
$template->param(

View File

@ -103,7 +103,7 @@ if (! $limit){
}
my ($picture, $dberror) = GetPatronImage($data->{'cardnumber'});
my ($picture, $dberror) = GetPatronImage($data->{'borrowernumber'});
$template->param( picture => 1 ) if $picture;
if (C4::Context->preference('ExtendedPatronAttributes')) {

View File

@ -128,7 +128,7 @@ $template->param(
RoutingSerials => C4::Context->preference('RoutingSerials'),
);
my ($picture, $dberror) = GetPatronImage($borrower->{'cardnumber'});
my ($picture, $dberror) = GetPatronImage($borrower->{'borrowernumber'});
$template->param( picture => 1 ) if $picture;
output_html_with_http_headers $query, $cookie, $template->output;

View File

@ -91,7 +91,7 @@ if (C4::Context->preference('ExtendedPatronAttributes')) {
);
}
my ($picture, $dberror) = GetPatronImage($borrower->{'cardnumber'});
my ($picture, $dberror) = GetPatronImage($borrower->{'borrowernumber'});
$template->param( picture => 1 ) if $picture;
$template->param(

View File

@ -200,7 +200,7 @@ elsif ( $action eq 'edit' ) { #Display logged in borrower's data
borrower => $borrower, );
if (C4::Context->preference('OPACpatronimages')) {
my ($image, $dberror) = GetPatronImage($borrower->{cardnumber});
my ($image, $dberror) = GetPatronImage($borrower->{borrowernumber});
if ($image) {
$template->param(
display_patron_image => 1

View File

@ -37,9 +37,8 @@ my %cookies = fetch CGI::Cookie;
my $sessid = $cookies{'CGISESSID'}->value;
my ($auth_status, $auth_sessid) = check_cookie_auth($sessid, $needed_flags);
my $borrowernumber = C4::Context->userenv->{'number'};
my $cardnumber = C4::Context->userenv->{'cardnumber'};
my ($imagedata, $dberror) = GetPatronImage($cardnumber);
my ($imagedata, $dberror) = GetPatronImage($borrowernumber);
if ($dberror) {
print $query->header(status => '500 internal error');

View File

@ -248,7 +248,7 @@ if ($borrower->{cardnumber}) {
);
if (C4::Context->preference('ShowPatronImageInWebBasedSelfCheck')) {
my ($image, $dberror) = GetPatronImage($borrower->{cardnumber});
my ($image, $dberror) = GetPatronImage($borrower->{borrowernumber});
if ($image) {
$template->param(
display_patron_image => 1,

View File

@ -33,9 +33,9 @@ unless (C4::Context->preference('ShowPatronImageInWebBasedSelfCheck')) {
exit;
}
my ($cardnumber) = C4::Service->require_params('cardnumber');
my ($borrowernumber) = C4::Service->require_params('borrowernumber');
my ($imagedata, $dberror) = GetPatronImage($cardnumber);
my ($imagedata, $dberror) = GetPatronImage($borrowernumber);
if ($dberror) {
print $query->header(status => '500 internal error');

View File

@ -145,7 +145,7 @@ foreach my $item (@{$items}) {
next PROCESS_IMAGES;
}
elsif ($images->{$_}->{'data_source'}->[0]->{'image_source'} eq 'patronimages') {
($image_data, $error) = GetPatronImage($card_number);
($image_data, $error) = GetPatronImage($borrower_number);
warn sprintf('No image exists for borrower number %s.', $borrower_number) if !$image_data;
next PROCESS_IMAGES if !$image_data;
}

View File

@ -146,7 +146,7 @@ if ( ($op eq 'Upload') && $uploadfile ) { # Case is important in these ope
$template->param(cardnumber => $cardnumber);
$template->param(filetype => $filetype);
} elsif ( $op eq 'Delete' ) {
my $dberror = RmPatronImage($cardnumber);
my $dberror = RmPatronImage($borrowernumber);
$debug and warn "Patron image deleted for $cardnumber";
warn "Database returned $dberror" if $dberror;
}

View File

@ -72,7 +72,7 @@ if ($src eq 'circ') { # if we were called from circulation, use the circulatio
use C4::Members;
my $borrowernumber = $object;
my $data = GetMember('borrowernumber'=>$borrowernumber);
my ($picture, $dberror) = GetPatronImage($data->{'cardnumber'});
my ($picture, $dberror) = GetPatronImage($data->{'borrowernumber'});
$template->param( picture => 1 ) if $picture;
$template->param( menu => 1,