View | Details | Raw Unified | Return to bug 1633
Collapse All | Expand All

(-)a/C4/Auth.pm (+1 lines)
Lines 391-396 sub get_template_and_user { Link Here
391
            NoZebra                     => C4::Context->preference('NoZebra'),
391
            NoZebra                     => C4::Context->preference('NoZebra'),
392
            EasyAnalyticalRecords       => C4::Context->preference('EasyAnalyticalRecords'),
392
            EasyAnalyticalRecords       => C4::Context->preference('EasyAnalyticalRecords'),
393
            LocalCoverImages            => C4::Context->preference('LocalCoverImages'),
393
            LocalCoverImages            => C4::Context->preference('LocalCoverImages'),
394
            OPACLocalCoverImages        => C4::Context->preference('OPACLocalCoverImages'),
394
            AllowMultipleCovers         => C4::Context->preference('AllowMultipleCovers'),
395
            AllowMultipleCovers         => C4::Context->preference('AllowMultipleCovers'),
395
        );
396
        );
396
    }
397
    }
(-)a/C4/Images.pm (-44 / +84 lines)
Lines 1-4 Link Here
1
package C4::Images;
1
package C4::Images;
2
3
# Copyright (C) 2011 C & P Bibliography Services
4
# Jared Camins-Esakov <jcamins@cpbibliograpy.com>
5
#
6
# This file is part of Koha.
7
#
8
# Koha is free software; you can redistribute it and/or modify it under the
9
# terms of the GNU General Public License as published by the Free Software
10
# Foundation; either version 2 of the License, or (at your option) any later
11
# version.
12
#
13
# Koha is distributed in the hope that it will be useful, but WITHOUT ANY
14
# WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR
15
# A PARTICULAR PURPOSE.  See the GNU General Public License for more details.
16
#
17
# You should have received a copy of the GNU General Public License along
18
# with Koha; if not, write to the Free Software Foundation, Inc.,
19
# 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
20
2
use strict;
21
use strict;
3
use warnings;
22
use warnings;
4
use 5.010;
23
use 5.010;
Lines 9-25 use GD; Link Here
9
use vars qw($debug $VERSION @ISA @EXPORT);
28
use vars qw($debug $VERSION @ISA @EXPORT);
10
29
11
BEGIN {
30
BEGIN {
12
	# set the version for version checking
31
13
	$VERSION = 3.03;
32
    # set the version for version checking
14
	require Exporter;
33
    $VERSION = 3.03;
15
	@ISA    = qw(Exporter);
34
    require Exporter;
16
	@EXPORT = qw(
35
    @ISA    = qw(Exporter);
17
        &PutImage
36
    @EXPORT = qw(
18
        &RetrieveImage
37
      &PutImage
19
        &ListImagesForBiblio
38
      &RetrieveImage
20
        &DelImage
39
      &ListImagesForBiblio
40
      &DelImage
21
    );
41
    );
22
	$debug = $ENV{KOHA_DEBUG} || $ENV{DEBUG} || 0;
42
    $debug = $ENV{KOHA_DEBUG} || $ENV{DEBUG} || 0;
23
}
43
}
24
44
25
=head2 PutImage
45
=head2 PutImage
Lines 31-57 Stores binary image data and thumbnail in database, optionally replacing existin Link Here
31
=cut
51
=cut
32
52
33
sub PutImage {
53
sub PutImage {
34
    my ($biblionumber, $srcimage, $replace) = @_;
54
    my ( $biblionumber, $srcimage, $replace ) = @_;
35
55
36
    return -1 unless defined($srcimage);
56
    return -1 unless defined($srcimage);
37
57
38
    if ($replace) {
58
    if ($replace) {
39
        foreach (ListImagesForBiblio($biblionumber)) {
59
        foreach ( ListImagesForBiblio($biblionumber) ) {
40
            DelImage($_);
60
            DelImage($_);
41
        }
61
        }
42
    }
62
    }
43
63
44
    my $dbh = C4::Context->dbh;
64
    my $dbh = C4::Context->dbh;
45
    my $query = "INSERT INTO biblioimages (biblionumber, mimetype, imagefile, thumbnail) VALUES (?,?,?,?);";
65
    my $query =
66
"INSERT INTO biblioimages (biblionumber, mimetype, imagefile, thumbnail) VALUES (?,?,?,?);";
46
    my $sth = $dbh->prepare($query);
67
    my $sth = $dbh->prepare($query);
47
68
48
    my $mimetype = 'image/png';	# GD autodetects three basic image formats: PNG, JPEG, XPM; we will convert all to PNG which is lossless...
69
    my $mimetype = 'image/png'
49
# Check the pixel size of the image we are about to import...
70
      ; # GD autodetects three basic image formats: PNG, JPEG, XPM; we will convert all to PNG which is lossless...
50
    my $thumbnail = _scale_image($srcimage, 140, 200);    # MAX pixel dims are 140 X 200 for thumbnail...
71
51
    my $fullsize = _scale_image($srcimage, 600, 800);   # MAX pixel dims are 600 X 800 for full-size image...
72
    # Check the pixel size of the image we are about to import...
73
    my $thumbnail = _scale_image( $srcimage, 140, 200 )
74
      ;    # MAX pixel dims are 140 X 200 for thumbnail...
75
    my $fullsize = _scale_image( $srcimage, 600, 800 )
76
      ;    # MAX pixel dims are 600 X 800 for full-size image...
52
    $debug and warn "thumbnail is " . length($thumbnail) . " bytes.";
77
    $debug and warn "thumbnail is " . length($thumbnail) . " bytes.";
53
78
54
    $sth->execute($biblionumber,$mimetype,$fullsize->png(),$thumbnail->png());
79
    $sth->execute( $biblionumber, $mimetype, $fullsize->png(),
80
        $thumbnail->png() );
55
    my $dberror = $sth->errstr;
81
    my $dberror = $sth->errstr;
56
    warn "Error returned inserting $biblionumber.$mimetype." if $sth->errstr;
82
    warn "Error returned inserting $biblionumber.$mimetype." if $sth->errstr;
57
    undef $thumbnail;
83
    undef $thumbnail;
Lines 70-83 sub RetrieveImage { Link Here
70
    my ($imagenumber) = @_;
96
    my ($imagenumber) = @_;
71
97
72
    my $dbh = C4::Context->dbh;
98
    my $dbh = C4::Context->dbh;
73
    my $query = 'SELECT mimetype, imagefile, thumbnail FROM biblioimages WHERE imagenumber = ?';
99
    my $query =
100
'SELECT mimetype, imagefile, thumbnail FROM biblioimages WHERE imagenumber = ?';
74
    my $sth = $dbh->prepare($query);
101
    my $sth = $dbh->prepare($query);
75
    $sth->execute($imagenumber);
102
    $sth->execute($imagenumber);
76
    my $imagedata = $sth->fetchrow_hashref;
103
    my $imagedata = $sth->fetchrow_hashref;
77
    if ($sth->err) {
104
    if ( $sth->err ) {
78
        warn "Database error!";
105
        warn "Database error!";
79
        return undef;
106
        return undef;
80
    } else {
107
    }
108
    else {
81
        return $imagedata;
109
        return $imagedata;
82
    }
110
    }
83
}
111
}
Lines 89-110 Gets a list of all images associated with a particular biblio. Link Here
89
117
90
=cut
118
=cut
91
119
92
93
sub ListImagesForBiblio {
120
sub ListImagesForBiblio {
94
    my ($biblionumber) = @_;
121
    my ($biblionumber) = @_;
95
122
96
    my @imagenumbers;
123
    my @imagenumbers;
97
    my $dbh = C4::Context->dbh;
124
    my $dbh   = C4::Context->dbh;
98
    my $query = 'SELECT imagenumber FROM biblioimages WHERE biblionumber = ?';
125
    my $query = 'SELECT imagenumber FROM biblioimages WHERE biblionumber = ?';
99
    my $sth = $dbh->prepare($query);
126
    my $sth   = $dbh->prepare($query);
100
    $sth->execute($biblionumber);
127
    $sth->execute($biblionumber);
101
    warn "Database error!" if $sth->errstr;
128
    warn "Database error!" if $sth->errstr;
102
    if (!$sth->errstr && $sth->rows > 0) {
129
    if ( !$sth->errstr && $sth->rows > 0 ) {
103
        while (my $row = $sth->fetchrow_hashref) {
130
        while ( my $row = $sth->fetchrow_hashref ) {
104
            push @imagenumbers, $row->{'imagenumber'};
131
            push @imagenumbers, $row->{'imagenumber'};
105
        }
132
        }
106
        return @imagenumbers;
133
        return @imagenumbers;
107
    } else {
134
    }
135
    else {
108
        return undef;
136
        return undef;
109
    }
137
    }
110
}
138
}
Lines 120-128 Removes the image with the supplied imagenumber. Link Here
120
sub DelImage {
148
sub DelImage {
121
    my ($imagenumber) = @_;
149
    my ($imagenumber) = @_;
122
    warn "Imagenumber passed to DelImage is $imagenumber" if $debug;
150
    warn "Imagenumber passed to DelImage is $imagenumber" if $debug;
123
    my $dbh = C4::Context->dbh;
151
    my $dbh   = C4::Context->dbh;
124
    my $query = "DELETE FROM biblioimages WHERE imagenumber = ?;";
152
    my $query = "DELETE FROM biblioimages WHERE imagenumber = ?;";
125
    my $sth = $dbh->prepare($query);
153
    my $sth   = $dbh->prepare($query);
126
    $sth->execute($imagenumber);
154
    $sth->execute($imagenumber);
127
    my $dberror = $sth->errstr;
155
    my $dberror = $sth->errstr;
128
    warn "Database error!" if $sth->errstr;
156
    warn "Database error!" if $sth->errstr;
Lines 130-153 sub DelImage { Link Here
130
}
158
}
131
159
132
sub _scale_image {
160
sub _scale_image {
133
    my ($image, $maxwidth, $maxheight) = @_;
161
    my ( $image, $maxwidth, $maxheight ) = @_;
134
    my ($width, $height) = $image->getBounds();
162
    my ( $width, $height ) = $image->getBounds();
135
    $debug and warn "image is $width pix X $height pix.";
163
    $debug and warn "image is $width pix X $height pix.";
136
    if ($width > $maxwidth || $height > $maxheight) {
164
    if ( $width > $maxwidth || $height > $maxheight ) {
165
137
#        $debug and warn "$filename exceeds the maximum pixel dimensions of $maxwidth X $maxheight. Resizing...";
166
#        $debug and warn "$filename exceeds the maximum pixel dimensions of $maxwidth X $maxheight. Resizing...";
138
        my $percent_reduce;    # Percent we will reduce the image dimensions by...
167
        my $percent_reduce;  # Percent we will reduce the image dimensions by...
139
            if ($width > $maxwidth) {
168
        if ( $width > $maxwidth ) {
140
                $percent_reduce = sprintf("%.5f",($maxwidth/$width));    # If the width is oversize, scale based on width overage...
169
            $percent_reduce =
141
            } else {
170
              sprintf( "%.5f", ( $maxwidth / $width ) )
142
                $percent_reduce = sprintf("%.5f",($maxheight/$height));    # otherwise scale based on height overage.
171
              ;    # If the width is oversize, scale based on width overage...
143
            }
172
        }
144
        my $width_reduce = sprintf("%.0f", ($width * $percent_reduce));
173
        else {
145
        my $height_reduce = sprintf("%.0f", ($height * $percent_reduce));
174
            $percent_reduce =
146
        $debug and warn "Reducing image by " . ($percent_reduce * 100) . "\% or to $width_reduce pix X $height_reduce pix";
175
              sprintf( "%.5f", ( $maxheight / $height ) )
147
        my $newimage = GD::Image->new($width_reduce, $height_reduce, 1); #'1' creates true color image...
176
              ;    # otherwise scale based on height overage.
148
        $newimage->copyResampled($image,0,0,0,0,$width_reduce,$height_reduce,$width,$height);
177
        }
178
        my $width_reduce  = sprintf( "%.0f", ( $width * $percent_reduce ) );
179
        my $height_reduce = sprintf( "%.0f", ( $height * $percent_reduce ) );
180
        $debug
181
          and warn "Reducing image by "
182
          . ( $percent_reduce * 100 )
183
          . "\% or to $width_reduce pix X $height_reduce pix";
184
        my $newimage = GD::Image->new( $width_reduce, $height_reduce, 1 )
185
          ;        #'1' creates true color image...
186
        $newimage->copyResampled( $image, 0, 0, 0, 0, $width_reduce,
187
            $height_reduce, $width, $height );
149
        return $newimage;
188
        return $newimage;
150
    } else {
189
    }
190
    else {
151
        return $image;
191
        return $image;
152
    }
192
    }
153
}
193
}
(-)a/catalogue/image.pl (-14 / +28 lines)
Lines 1-5 Link Here
1
#!/usr/bin/perl
1
#!/usr/bin/perl
2
#
2
#
3
# Copyright (C) 2011 C & P Bibliography Services
4
# Jared Camins-Esakov <jcamins@cpbibliograpy.com>
5
#
3
# based on patronimage.pl
6
# based on patronimage.pl
4
#
7
#
5
# This file is part of Koha.
8
# This file is part of Koha.
Lines 23-36 Link Here
23
use strict;
26
use strict;
24
use warnings;
27
use warnings;
25
28
26
use CGI; #qw(:standard escapeHTML);
29
use CGI;    #qw(:standard escapeHTML);
27
use C4::Context;
30
use C4::Context;
28
use C4::Images;
31
use C4::Images;
29
32
30
$|=1;
33
$| = 1;
31
34
32
my $DEBUG = 0;
35
my $DEBUG = 0;
33
my $data = new CGI;
36
my $data  = new CGI;
34
my $imagenumber;
37
my $imagenumber;
35
38
36
=head1 NAME
39
=head1 NAME
Lines 57-73 imagenumber, a random image is selected. Link Here
57
60
58
error() unless C4::Context->preference("OPACLocalCoverImages");
61
error() unless C4::Context->preference("OPACLocalCoverImages");
59
62
60
if (defined $data->param('imagenumber')) {
63
if ( defined $data->param('imagenumber') ) {
61
    $imagenumber = $data->param('imagenumber');
64
    $imagenumber = $data->param('imagenumber');
62
} elsif (defined $data->param('biblionumber')) {
65
}
63
    my @imagenumbers = ListImagesForBiblio($data->param('biblionumber'));
66
elsif ( defined $data->param('biblionumber') ) {
67
    my @imagenumbers = ListImagesForBiblio( $data->param('biblionumber') );
64
    if (@imagenumbers) {
68
    if (@imagenumbers) {
65
        $imagenumber = $imagenumbers[0];
69
        $imagenumber = $imagenumbers[0];
66
    } else {
70
    }
71
    else {
67
        warn "No images for this biblio" if $DEBUG;
72
        warn "No images for this biblio" if $DEBUG;
68
        error();
73
        error();
69
    }
74
    }
70
} else {
75
}
76
else {
71
    $imagenumber = shift;
77
    $imagenumber = shift;
72
}
78
}
73
79
Lines 79-103 if ($imagenumber) { Link Here
79
85
80
    if ($imagedata) {
86
    if ($imagedata) {
81
        my $image;
87
        my $image;
82
        if ($data->param('thumbnail')) {
88
        if ( $data->param('thumbnail') ) {
83
            $image = $imagedata->{'thumbnail'};
89
            $image = $imagedata->{'thumbnail'};
84
        } else {
90
        }
91
        else {
85
            $image = $imagedata->{'imagefile'};
92
            $image = $imagedata->{'imagefile'};
86
        }
93
        }
87
        print $data->header (-type => $imagedata->{'mimetype'}, -'Cache-Control' => 'no-store', -expires => 'now', -Content_Length => length ($image)), $image;
94
        print $data->header(
95
            -type            => $imagedata->{'mimetype'},
96
            -'Cache-Control' => 'no-store',
97
            -expires         => 'now',
98
            -Content_Length  => length($image)
99
        ), $image;
88
        exit;
100
        exit;
89
    } else {
101
    }
102
    else {
90
        warn "No image exists for $imagenumber" if $DEBUG;
103
        warn "No image exists for $imagenumber" if $DEBUG;
91
        error();
104
        error();
92
    }
105
    }
93
} else {
106
}
107
else {
94
    error();
108
    error();
95
}
109
}
96
110
97
error();
111
error();
98
112
99
sub error {
113
sub error {
100
    print $data->header ( -status=> '404', -expires => 'now' );
114
    print $data->header( -status => '404', -expires => 'now' );
101
    exit;
115
    exit;
102
}
116
}
103
117
(-)a/catalogue/imageviewer.pl (-17 / +21 lines)
Lines 40-77 my ( $template, $borrowernumber, $cookie ) = get_template_and_user( Link Here
40
);
40
);
41
41
42
my $biblionumber = $query->param('biblionumber') || $query->param('bib');
42
my $biblionumber = $query->param('biblionumber') || $query->param('bib');
43
my $imagenumber = $query ->param('imagenumber');
43
my $imagenumber = $query->param('imagenumber');
44
my ($count, $biblio) = GetBiblio($biblionumber);
44
my ( $count, $biblio ) = GetBiblio($biblionumber);
45
my $itemcount = GetItemsCount($biblionumber);
45
my $itemcount = GetItemsCount($biblionumber);
46
46
47
my @items = GetItemsInfo( $biblionumber );
47
my @items = GetItemsInfo($biblionumber);
48
48
49
my $norequests = 1;
49
my $norequests = 1;
50
foreach my $item (@items) {
50
foreach my $item (@items) {
51
51
    # can place holds defaults to yes
52
    # can place holds defaults to yes
52
    $norequests = 0 unless ( ( $item->{'notforloan_per_itemtype'} > 0 ) || ( $item->{'itemnotforloan'} > 0 ) );
53
    $norequests = 0
54
      unless ( ( $item->{'notforloan_per_itemtype'} > 0 )
55
        || ( $item->{'itemnotforloan'} > 0 ) );
53
}
56
}
54
57
55
if($query->cookie("holdfor")){
58
if ( $query->cookie("holdfor") ) {
56
    my $holdfor_patron = GetMember('borrowernumber' => $query->cookie("holdfor"));
59
    my $holdfor_patron =
60
      GetMember( 'borrowernumber' => $query->cookie("holdfor") );
57
    $template->param(
61
    $template->param(
58
        holdfor => $query->cookie("holdfor"),
62
        holdfor            => $query->cookie("holdfor"),
59
        holdfor_surname => $holdfor_patron->{'surname'},
63
        holdfor_surname    => $holdfor_patron->{'surname'},
60
        holdfor_firstname => $holdfor_patron->{'firstname'},
64
        holdfor_firstname  => $holdfor_patron->{'firstname'},
61
        holdfor_cardnumber => $holdfor_patron->{'cardnumber'},
65
        holdfor_cardnumber => $holdfor_patron->{'cardnumber'},
62
    );
66
    );
63
}
67
}
64
68
65
if (C4::Context->preference("LocalCoverImages")) {
69
if ( C4::Context->preference("LocalCoverImages") ) {
66
    my @images = ListImagesForBiblio($biblionumber);
70
    my @images = ListImagesForBiblio($biblionumber);
67
    $template->{VARS}->{'LocalCoverImages'} = 1;
71
    $template->{VARS}->{'LocalCoverImages'} = 1;
68
    $template->{VARS}->{'images'} = \@images;
72
    $template->{VARS}->{'images'}           = \@images;
69
    $template->{VARS}->{'imagenumber'} = $imagenumber || $images[0] || '';
73
    $template->{VARS}->{'imagenumber'}      = $imagenumber || $images[0] || '';
70
}
74
}
71
    $template->{VARS}->{'count'} = $itemcount;
75
$template->{VARS}->{'count'}        = $itemcount;
72
    $template->{VARS}->{'biblionumber'} = $biblionumber;
76
$template->{VARS}->{'biblionumber'} = $biblionumber;
73
    $template->{VARS}->{'norequests'} = $norequests;
77
$template->{VARS}->{'norequests'}   = $norequests;
74
    $template->param( C4::Search::enabled_staff_search_views );
78
$template->param(C4::Search::enabled_staff_search_views);
75
    $template->{VARS}->{'biblio'} = $biblio;
79
$template->{VARS}->{'biblio'} = $biblio;
76
80
77
output_html_with_http_headers $query, $cookie, $template->output;
81
output_html_with_http_headers $query, $cookie, $template->output;
(-)a/installer/data/mysql/atomicupdate/local_cover_images.pl (-7 / +17 lines)
Lines 2-10 Link Here
2
use strict;
2
use strict;
3
use warnings;
3
use warnings;
4
use C4::Context;
4
use C4::Context;
5
my $dbh=C4::Context->dbh;
5
my $dbh = C4::Context->dbh;
6
6
7
$dbh->do( q|CREATE TABLE `biblioimages` (
7
$dbh->do(
8
    q|CREATE TABLE `biblioimages` (
8
      `imagenumber` int(11) NOT NULL AUTO_INCREMENT,
9
      `imagenumber` int(11) NOT NULL AUTO_INCREMENT,
9
      `biblionumber` int(11) NOT NULL,
10
      `biblionumber` int(11) NOT NULL,
10
      `mimetype` varchar(15) NOT NULL,
11
      `mimetype` varchar(15) NOT NULL,
Lines 12-20 $dbh->do( q|CREATE TABLE `biblioimages` ( Link Here
12
      `thumbnail` mediumblob NOT NULL,
13
      `thumbnail` mediumblob NOT NULL,
13
      PRIMARY KEY (`imagenumber`),
14
      PRIMARY KEY (`imagenumber`),
14
      CONSTRAINT `bibliocoverimage_fk1` FOREIGN KEY (`biblionumber`) REFERENCES `biblio` (`biblionumber`) ON DELETE CASCADE ON UPDATE CASCADE
15
      CONSTRAINT `bibliocoverimage_fk1` FOREIGN KEY (`biblionumber`) REFERENCES `biblio` (`biblionumber`) ON DELETE CASCADE ON UPDATE CASCADE
15
      ) ENGINE=InnoDB DEFAULT CHARSET=utf8|);
16
      ) ENGINE=InnoDB DEFAULT CHARSET=utf8|
16
$dbh->do( q|INSERT INTO `systempreferences` (variable,value,explanation,options,type) VALUES ('OPACLocalCoverImages','0','Display local cover images on OPAC search and details pages.','1','YesNo')|);
17
);
17
$dbh->do( q|INSERT INTO `systempreferences` (variable,value,explanation,options,type) VALUES ('LocalCoverImages','0','Display local cover images on intranet search and details pages.','1','YesNo')|);
18
$dbh->do(
18
$dbh->do( q|INSERT INTO `systempreferences` (variable,value,explanation,options,type) VALUES ('AllowMultipleCovers','0','Allow multiple cover images to be attached to each bibliographic record.','1','YesNo')|);
19
q|INSERT INTO `systempreferences` (variable,value,explanation,options,type) VALUES ('OPACLocalCoverImages','0','Display local cover images on OPAC search and details pages.','1','YesNo')|
19
$dbh->do( q|INSERT INTO permissions (module_bit, code, description) VALUES (13, 'upload_local_cover_images', 'Upload local cover images')|);
20
);
21
$dbh->do(
22
q|INSERT INTO `systempreferences` (variable,value,explanation,options,type) VALUES ('LocalCoverImages','0','Display local cover images on intranet search and details pages.','1','YesNo')|
23
);
24
$dbh->do(
25
q|INSERT INTO `systempreferences` (variable,value,explanation,options,type) VALUES ('AllowMultipleCovers','0','Allow multiple cover images to be attached to each bibliographic record.','1','YesNo')|
26
);
27
$dbh->do(
28
q|INSERT INTO permissions (module_bit, code, description) VALUES (13, 'upload_local_cover_images', 'Upload local cover images')|
29
);
20
print "Upgrade done (Added support for local cover images)\n";
30
print "Upgrade done (Added support for local cover images)\n";
(-)a/koha-tmpl/intranet-tmpl/prog/en/includes/cat-toolbar.inc (-1 / +1 lines)
Lines 102-108 function confirm_items_deletion() { Link Here
102
	        [% IF ( CAN_user_editcatalogue_edit_items ) %]{ text: _("Edit Items"), url: "/cgi-bin/koha/cataloguing/additem.pl?biblionumber=[% biblionumber %]" },[% END %]
102
	        [% IF ( CAN_user_editcatalogue_edit_items ) %]{ text: _("Edit Items"), url: "/cgi-bin/koha/cataloguing/additem.pl?biblionumber=[% biblionumber %]" },[% END %]
103
	        [% IF ( CAN_user_editcatalogue_edit_items ) %]{ text: _("Attach Item"), url: "/cgi-bin/koha/cataloguing/moveitem.pl?biblionumber=[% biblionumber %]" },[% END %]
103
	        [% IF ( CAN_user_editcatalogue_edit_items ) %]{ text: _("Attach Item"), url: "/cgi-bin/koha/cataloguing/moveitem.pl?biblionumber=[% biblionumber %]" },[% END %]
104
            [% IF ( EasyAnalyticalRecords ) %][% IF ( CAN_user_editcatalogue_edit_items ) %]{ text: _("Link to Host Item"), url: "/cgi-bin/koha/cataloguing/linkitem.pl?biblionumber=[% biblionumber %]" },[% END %][% END %]
104
            [% IF ( EasyAnalyticalRecords ) %][% IF ( CAN_user_editcatalogue_edit_items ) %]{ text: _("Link to Host Item"), url: "/cgi-bin/koha/cataloguing/linkitem.pl?biblionumber=[% biblionumber %]" },[% END %][% END %]
105
            [% IF ( LocalCoverImages ) %][% IF ( CAN_user_tools_upload_local_cover_images ) %]{ text: _("Upload Image"), url: "/cgi-bin/koha/tools/upload-cover-image.pl?biblionumber=[% biblionumber %]&filetype=image" },[% END %][% END %]
105
            [% IF ( LocalCoverImages || OPACLocalCoverImages) %][% IF ( CAN_user_tools_upload_local_cover_images ) %]{ text: _("Upload Image"), url: "/cgi-bin/koha/tools/upload-cover-image.pl?biblionumber=[% biblionumber %]&filetype=image" },[% END %][% END %]
106
	        [% IF ( CAN_user_editcatalogue_edit_catalogue ) %]{ text: _("Edit as New (Duplicate)"), url: "/cgi-bin/koha/cataloguing/addbiblio.pl?biblionumber=[% biblionumber %]&amp;frameworkcode=&amp;op=duplicate" },[% END %]
106
	        [% IF ( CAN_user_editcatalogue_edit_catalogue ) %]{ text: _("Edit as New (Duplicate)"), url: "/cgi-bin/koha/cataloguing/addbiblio.pl?biblionumber=[% biblionumber %]&amp;frameworkcode=&amp;op=duplicate" },[% END %]
107
			[% IF ( CAN_user_editcatalogue_edit_catalogue ) %]{ text: _("Replace Record via Z39.50"), onclick: {fn: PopupZ3950 } },[% END %]
107
			[% IF ( CAN_user_editcatalogue_edit_catalogue ) %]{ text: _("Replace Record via Z39.50"), onclick: {fn: PopupZ3950 } },[% END %]
108
			[% IF ( CAN_user_editcatalogue_edit_catalogue ) %]{ text: _("Delete Record"), onclick: {fn: confirm_deletion }[% IF ( count ) %],id:'disabled'[% END %] },[% END %]
108
			[% IF ( CAN_user_editcatalogue_edit_catalogue ) %]{ text: _("Delete Record"), onclick: {fn: confirm_deletion }[% IF ( count ) %],id:'disabled'[% END %] },[% END %]
(-)a/koha-tmpl/intranet-tmpl/prog/en/modules/catalogue/imageviewer.tt (-33 / +33 lines)
Lines 18-36 function showCover(img) { Link Here
18
</script>
18
</script>
19
<style type="text/css">
19
<style type="text/css">
20
#largeCoverImg {
20
#largeCoverImg {
21
	border : 1px solid #CCCCCC;
21
    border : 1px solid #CCCCCC;
22
	display : block;
22
    display : block;
23
	margin : auto;
23
    margin : auto;
24
	padding : 1em;
24
    padding : 1em;
25
}
25
}
26
#thumbnails {
26
#thumbnails {
27
	text-align : center;
27
    text-align : center;
28
}
28
}
29
#thumbnails a img {
29
#thumbnails a img {
30
	border : 1px solid #0000CC;
30
    border : 1px solid #0000CC;
31
}
31
}
32
img.thumbnail {
32
img.thumbnail {
33
	display : block;
33
    display : block;
34
    float : none;
34
    float : none;
35
    margin: 0 5px 5px 0;
35
    margin: 0 5px 5px 0;
36
    padding : .5em;
36
    padding : .5em;
Lines 40-46 img.thumbnail { Link Here
40
    border-color: black;
40
    border-color: black;
41
    cursor : default;
41
    cursor : default;
42
    opacity:0.4;
42
    opacity:0.4;
43
	filter:alpha(opacity=40); /* For IE8 and earlier */
43
    filter:alpha(opacity=40); /* For IE8 and earlier */
44
}
44
}
45
</style>[% END %]
45
</style>[% END %]
46
</head>
46
</head>
Lines 55-63 img.thumbnail { Link Here
55
<div id="doc3" class="yui-t1">
55
<div id="doc3" class="yui-t1">
56
56
57
<div id="bd">
57
<div id="bd">
58
	<div id="yui-main">
58
    <div id="yui-main">
59
	<div class="yui-b">
59
    <div class="yui-b">
60
	<div class="yui-ge">
60
    <div class="yui-ge">
61
61
62
[% INCLUDE 'cat-toolbar.inc' %]
62
[% INCLUDE 'cat-toolbar.inc' %]
63
63
Lines 65-96 img.thumbnail { Link Here
65
<h4>[% biblio.author %]</h4>
65
<h4>[% biblio.author %]</h4>
66
66
67
[% IF ( LocalCoverImages == 1 ) %]
67
[% IF ( LocalCoverImages == 1 ) %]
68
	[% IF ( images.size > 0 ) %]
68
    [% IF ( images.size > 0 ) %]
69
		<div class="yui-u first">
69
        <div class="yui-u first">
70
		<div id="largeCover">
70
        <div id="largeCover">
71
			<img id="largeCoverImg" alt="" src="/cgi-bin/koha/catalogue/image.pl?imagenumber=[% imagenumber %]" />
71
            <img id="largeCoverImg" alt="" src="/cgi-bin/koha/catalogue/image.pl?imagenumber=[% imagenumber %]" />
72
		</div></div>
72
        </div></div>
73
73
74
		<div class="yui-u"><div id="thumbnails">
74
        <div class="yui-u"><div id="thumbnails">
75
75
76
			[% FOREACH img IN images %]
76
            [% FOREACH img IN images %]
77
				[% IF img %]
77
                [% IF img %]
78
				<a href="/cgi-bin/koha/catalogue/imageviewer.pl?biblionumber=[% biblionumber %]&amp;imagenumber=[% img %]" onclick="showCover([% img %]); return false;">
78
                <a href="/cgi-bin/koha/catalogue/imageviewer.pl?biblionumber=[% biblionumber %]&amp;imagenumber=[% img %]" onclick="showCover([% img %]); return false;">
79
					[% IF ( imagenumber == img ) %]
79
                    [% IF ( imagenumber == img ) %]
80
						<img class="thumbnail selected" id="[% img %]" src="/cgi-bin/koha/catalogue/image.pl?imagenumber=[% img %]&amp;thumbnail=1" alt="Thumbnail" />
80
                        <img class="thumbnail selected" id="[% img %]" src="/cgi-bin/koha/catalogue/image.pl?imagenumber=[% img %]&amp;thumbnail=1" alt="Thumbnail" />
81
					[% ELSE %]
81
                    [% ELSE %]
82
						<img class="thumbnail" id="[% img %]" src="/cgi-bin/koha/catalogue/image.pl?imagenumber=[% img %]&amp;thumbnail=1" alt="Thumbnail" />
82
                        <img class="thumbnail" id="[% img %]" src="/cgi-bin/koha/catalogue/image.pl?imagenumber=[% img %]&amp;thumbnail=1" alt="Thumbnail" />
83
					[% END %]
83
                    [% END %]
84
				</a>
84
                </a>
85
				[% END %]
85
                [% END %]
86
			[% END %]
86
            [% END %]
87
		</div></div>
87
        </div></div>
88
88
89
	[% ELSE %]
89
    [% ELSE %]
90
		<div class="dialog message">There are no images for this record.</div>
90
        <div class="dialog message">There are no images for this record.</div>
91
	[% END %]
91
    [% END %]
92
[% ELSE %]
92
[% ELSE %]
93
	<div class="dialog message">Local images have not been enabled by your system administrator.</div>
93
    <div class="dialog message">Local images have not been enabled by your system administrator.</div>
94
[% END %]
94
[% END %]
95
95
96
</div>
96
</div>
(-)a/koha-tmpl/opac-tmpl/prog/en/modules/opac-imageviewer.tt (-30 / +30 lines)
Lines 5-11 Link Here
5
//<![CDATA[
5
//<![CDATA[
6
6
7
$(document).ready(function(){
7
$(document).ready(function(){
8
	$("#largeCoverImg").attr("src","/opac-tmpl/prog/images/loading.gif");
8
    $("#largeCoverImg").attr("src","/opac-tmpl/prog/images/loading.gif");
9
    showCover([% imagenumber %]);
9
    showCover([% imagenumber %]);
10
});
10
});
11
11
Lines 18-36 function showCover(img) { Link Here
18
</script>
18
</script>
19
<style type="text/css">
19
<style type="text/css">
20
#largeCoverImg {
20
#largeCoverImg {
21
	border : 1px solid #CCCCCC;
21
    border : 1px solid #CCCCCC;
22
	display : block;
22
    display : block;
23
	margin : auto;
23
    margin : auto;
24
	padding : 1em;
24
    padding : 1em;
25
}
25
}
26
#thumbnails {
26
#thumbnails {
27
	text-align : center;
27
    text-align : center;
28
}
28
}
29
#thumbnails a img {
29
#thumbnails a img {
30
	border : 2px solid #8EB3E7;
30
    border : 2px solid #8EB3E7;
31
}
31
}
32
img.thumbnail {
32
img.thumbnail {
33
	display : block;
33
    display : block;
34
    float : none;
34
    float : none;
35
    padding : .5em;
35
    padding : .5em;
36
}
36
}
Lines 39-45 img.thumbnail { Link Here
39
    border-color: black;
39
    border-color: black;
40
    cursor : default;
40
    cursor : default;
41
    opacity:0.4;
41
    opacity:0.4;
42
	filter:alpha(opacity=40); /* For IE8 and earlier */
42
    filter:alpha(opacity=40); /* For IE8 and earlier */
43
}
43
}
44
</style>
44
</style>
45
</head>
45
</head>
Lines 47-80 img.thumbnail { Link Here
47
[% IF ( OpacNav ) %]<div id="doc3" class="yui-t1">[% ELSE %]<div id="doc3" class="yui-t7">[% END %]
47
[% IF ( OpacNav ) %]<div id="doc3" class="yui-t1">[% ELSE %]<div id="doc3" class="yui-t7">[% END %]
48
   <div id="bd">
48
   <div id="bd">
49
[% INCLUDE 'masthead.inc' %]
49
[% INCLUDE 'masthead.inc' %]
50
	<div id="yui-main">
50
    <div id="yui-main">
51
	<div class="yui-b">
51
    <div class="yui-b">
52
	<div class="yui-ge">
52
    <div class="yui-ge">
53
	<div class="container">
53
    <div class="container">
54
	<h1 class="title">Images for 				[% IF ( BiblioDefaultViewmarc ) %]<a class="title" href="/cgi-bin/koha/opac-MARCdetail.pl?biblionumber=[% biblionumber |url %]" title="View details for this title">
54
    <h1 class="title">Images for                 [% IF ( BiblioDefaultViewmarc ) %]<a class="title" href="/cgi-bin/koha/opac-MARCdetail.pl?biblionumber=[% biblionumber |url %]" title="View details for this title">
55
                                [% ELSE %]
55
                                [% ELSE %]
56
                                [% IF ( BiblioDefaultViewisbd ) %]<a class="title" href="/cgi-bin/koha/opac-ISBDdetail.pl?biblionumber=[% biblionumber |url %]" title="View details for this title">
56
                                [% IF ( BiblioDefaultViewisbd ) %]<a class="title" href="/cgi-bin/koha/opac-ISBDdetail.pl?biblionumber=[% biblionumber |url %]" title="View details for this title">
57
                                [% ELSE %]<a class="title" href="/cgi-bin/koha/opac-detail.pl?biblionumber=[% biblionumber |url %]" title="View details for this title">
57
                                [% ELSE %]<a class="title" href="/cgi-bin/koha/opac-detail.pl?biblionumber=[% biblionumber |url %]" title="View details for this title">
58
                                [% END %]
58
                                [% END %]
59
                                [% END %][% biblio.title %]</a> [% biblio.author %]</h1>
59
                                [% END %][% biblio.title %]</a> [% biblio.author %]</h1>
60
	<div class="yui-u first">
60
    <div class="yui-u first">
61
61
62
		<div id="largeCover"><img id="largeCoverImg" alt="" src="/cgi-bin/koha/opac-image.pl?imagenumber=[% imagenumber %]" /></div></div>
62
        <div id="largeCover"><img id="largeCoverImg" alt="" src="/cgi-bin/koha/opac-image.pl?imagenumber=[% imagenumber %]" /></div></div>
63
63
64
	[% IF OPACLocalCoverImages == 1 %]
64
    [% IF OPACLocalCoverImages == 1 %]
65
	<div class="yui-u"><div id="thumbnails">
65
    <div class="yui-u"><div id="thumbnails">
66
			[% FOREACH img IN images %]
66
            [% FOREACH img IN images %]
67
				[% IF img %]
67
                [% IF img %]
68
				<a href="/cgi-bin/koha/opac-imageviewer.pl?biblionumber=[% biblionumber %]&amp;imagenumber=[% img %]" onclick="showCover([% img %]); return false;">
68
                <a href="/cgi-bin/koha/opac-imageviewer.pl?biblionumber=[% biblionumber %]&amp;imagenumber=[% img %]" onclick="showCover([% img %]); return false;">
69
				[% IF ( imagenumber == img ) %]<img class="thumbnail selected" id="[% img %]" src="/cgi-bin/koha/opac-image.pl?imagenumber=[% img %]&amp;thumbnail=1" alt="Thumbnail"/>
69
                [% IF ( imagenumber == img ) %]<img class="thumbnail selected" id="[% img %]" src="/cgi-bin/koha/opac-image.pl?imagenumber=[% img %]&amp;thumbnail=1" alt="Thumbnail"/>
70
				[% ELSE %]
70
                [% ELSE %]
71
				<img class="thumbnail" id="[% img %]" src="/cgi-bin/koha/opac-image.pl?imagenumber=[% img %]&amp;thumbnail=1" alt="Thumbnail"/>
71
                <img class="thumbnail" id="[% img %]" src="/cgi-bin/koha/opac-image.pl?imagenumber=[% img %]&amp;thumbnail=1" alt="Thumbnail"/>
72
				[% END %]
72
                [% END %]
73
				</a>
73
                </a>
74
				[% END %]
74
                [% END %]
75
			[% END %]
75
            [% END %]
76
		</div></div>
76
        </div></div>
77
	</div>
77
    </div>
78
[% ELSE %]
78
[% ELSE %]
79
Unfortunately, images are not enabled for this catalog at this time.
79
Unfortunately, images are not enabled for this catalog at this time.
80
[% END %]
80
[% END %]
(-)a/opac/opac-image.pl (-14 / +28 lines)
Lines 1-5 Link Here
1
#!/usr/bin/perl
1
#!/usr/bin/perl
2
#
2
#
3
# Copyright (C) 2011 C & P Bibliography Services
4
# Jared Camins-Esakov <jcamins@cpbibliograpy.com>
5
#
3
# based on patronimage.pl
6
# based on patronimage.pl
4
#
7
#
5
# This file is part of Koha.
8
# This file is part of Koha.
Lines 23-36 Link Here
23
use strict;
26
use strict;
24
use warnings;
27
use warnings;
25
28
26
use CGI; #qw(:standard escapeHTML);
29
use CGI;
27
use C4::Context;
30
use C4::Context;
28
use C4::Images;
31
use C4::Images;
29
32
30
$|=1;
33
$| = 1;
31
34
32
my $DEBUG = 0;
35
my $DEBUG = 0;
33
my $data = new CGI;
36
my $data  = new CGI;
34
my $imagenumber;
37
my $imagenumber;
35
38
36
=head1 NAME
39
=head1 NAME
Lines 57-73 imagenumber, a random image is selected. Link Here
57
60
58
error() unless C4::Context->preference("OPACLocalCoverImages");
61
error() unless C4::Context->preference("OPACLocalCoverImages");
59
62
60
if (defined $data->param('imagenumber')) {
63
if ( defined $data->param('imagenumber') ) {
61
    $imagenumber = $data->param('imagenumber');
64
    $imagenumber = $data->param('imagenumber');
62
} elsif (defined $data->param('biblionumber')) {
65
}
63
    my @imagenumbers = ListImagesForBiblio($data->param('biblionumber'));
66
elsif ( defined $data->param('biblionumber') ) {
67
    my @imagenumbers = ListImagesForBiblio( $data->param('biblionumber') );
64
    if (@imagenumbers) {
68
    if (@imagenumbers) {
65
        $imagenumber = $imagenumbers[0];
69
        $imagenumber = $imagenumbers[0];
66
    } else {
70
    }
71
    else {
67
        warn "No images for this biblio" if $DEBUG;
72
        warn "No images for this biblio" if $DEBUG;
68
        error();
73
        error();
69
    }
74
    }
70
} else {
75
}
76
else {
71
    $imagenumber = shift;
77
    $imagenumber = shift;
72
}
78
}
73
79
Lines 79-103 if ($imagenumber) { Link Here
79
85
80
    if ($imagedata) {
86
    if ($imagedata) {
81
        my $image;
87
        my $image;
82
        if ($data->param('thumbnail')) {
88
        if ( $data->param('thumbnail') ) {
83
            $image = $imagedata->{'thumbnail'};
89
            $image = $imagedata->{'thumbnail'};
84
        } else {
90
        }
91
        else {
85
            $image = $imagedata->{'imagefile'};
92
            $image = $imagedata->{'imagefile'};
86
        }
93
        }
87
        print $data->header (-type => $imagedata->{'mimetype'}, -'Cache-Control' => 'no-store', -expires => 'now', -Content_Length => length ($image)), $image;
94
        print $data->header(
95
            -type            => $imagedata->{'mimetype'},
96
            -'Cache-Control' => 'no-store',
97
            -expires         => 'now',
98
            -Content_Length  => length($image)
99
        ), $image;
88
        exit;
100
        exit;
89
    } else {
101
    }
102
    else {
90
        warn "No image exists for $imagenumber" if $DEBUG;
103
        warn "No image exists for $imagenumber" if $DEBUG;
91
        error();
104
        error();
92
    }
105
    }
93
} else {
106
}
107
else {
94
    error();
108
    error();
95
}
109
}
96
110
97
error();
111
error();
98
112
99
sub error {
113
sub error {
100
    print $data->header ( -status=> '404', -expires => 'now' );
114
    print $data->header( -status => '404', -expires => 'now' );
101
    exit;
115
    exit;
102
}
116
}
103
117
(-)a/opac/opac-imageviewer.pl (-5 / +5 lines)
Lines 33-51 my ( $template, $borrowernumber, $cookie ) = get_template_and_user( Link Here
33
        query           => $query,
33
        query           => $query,
34
        type            => "opac",
34
        type            => "opac",
35
        authnotrequired => ( C4::Context->preference("OpacPublic") ? 1 : 0 ),
35
        authnotrequired => ( C4::Context->preference("OpacPublic") ? 1 : 0 ),
36
        flagsrequired   => { borrow => 1 },
36
        flagsrequired => { borrow => 1 },
37
    }
37
    }
38
);
38
);
39
39
40
my $biblionumber = $query->param('biblionumber') || $query->param('bib');
40
my $biblionumber = $query->param('biblionumber') || $query->param('bib');
41
my $imagenumber = $query->param('imagenumber');
41
my $imagenumber = $query->param('imagenumber');
42
my ($count, $biblio) = GetBiblio($biblionumber);
42
my ( $count, $biblio ) = GetBiblio($biblionumber);
43
43
44
if (C4::Context->preference("OPACLocalCoverImages")) {
44
if ( C4::Context->preference("OPACLocalCoverImages") ) {
45
    my @images = ListImagesForBiblio($biblionumber);
45
    my @images = ListImagesForBiblio($biblionumber);
46
    $template->{VARS}->{'OPACLocalCoverImages'} = 1;
46
    $template->{VARS}->{'OPACLocalCoverImages'} = 1;
47
    $template->{VARS}->{'images'} = \@images;
47
    $template->{VARS}->{'images'}               = \@images;
48
    $template->{VARS}->{'biblionumber'} = $biblionumber;
48
    $template->{VARS}->{'biblionumber'}         = $biblionumber;
49
    $template->{VARS}->{'imagenumber'} = $imagenumber || $images[0] || '';
49
    $template->{VARS}->{'imagenumber'} = $imagenumber || $images[0] || '';
50
}
50
}
51
51
(-)a/tools/upload-cover-image.pl (-55 / +74 lines)
Lines 13-24 Link Here
13
# WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR
13
# WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR
14
# A PARTICULAR PURPOSE.  See the GNU General Public License for more details.
14
# A PARTICULAR PURPOSE.  See the GNU General Public License for more details.
15
#
15
#
16
# You should have received a copy of the GNU General Public License along with
16
# You should have received a copy of the GNU General Public License along
17
# Koha; if not, write to the Free Software Foundation, Inc., 59 Temple Place,
17
# with Koha; if not, write to the Free Software Foundation, Inc.,
18
# Suite 330, Boston, MA  02111-1307 USA
18
# 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
19
#
19
#
20
#
20
#
21
#
21
#
22
22
=head1 NAME
23
=head1 NAME
23
24
24
upload-cover-image.pl - Script for handling uploading of both single and bulk coverimages and importing them into the database.
25
upload-cover-image.pl - Script for handling uploading of both single and bulk coverimages and importing them into the database.
Lines 36-42 resized, maintaining aspect ratio. Link Here
36
37
37
=cut
38
=cut
38
39
39
40
use strict;
40
use strict;
41
use warnings;
41
use warnings;
42
42
Lines 53-159 my $debug = 1; Link Here
53
53
54
my $input = new CGI;
54
my $input = new CGI;
55
55
56
my $fileID=$input->param('uploadedfileid');
56
my $fileID = $input->param('uploadedfileid');
57
my ($template, $loggedinuser, $cookie)
57
my ( $template, $loggedinuser, $cookie ) = get_template_and_user(
58
	= get_template_and_user({template_name => "tools/upload-images.tmpl",
58
    {
59
					query => $input,
59
        template_name   => "tools/upload-images.tmpl",
60
					type => "intranet",
60
        query           => $input,
61
					authnotrequired => 0,
61
        type            => "intranet",
62
					flagsrequired => { tools => 'upload_cover_images'},
62
        authnotrequired => 0,
63
					debug => 0,
63
        flagsrequired   => { tools => 'upload_cover_images' },
64
					});
64
        debug           => 0,
65
65
    }
66
my $filetype            = $input->param('filetype');
66
);
67
my $biblionumber        = $input->param('biblionumber');
67
68
my $uploadfilename      = $input->param('uploadfile');
68
my $filetype       = $input->param('filetype');
69
my $replace             = !C4::Context->preference("AllowMultipleCovers") || $input->param('replace');
69
my $biblionumber   = $input->param('biblionumber');
70
my $op                  = $input->param('op');
70
my $uploadfilename = $input->param('uploadfile');
71
my %cookies             = parse CGI::Cookie($cookie);
71
my $replace        = !C4::Context->preference("AllowMultipleCovers")
72
my $sessionID           = $cookies{'CGISESSID'}->value;
72
  || $input->param('replace');
73
my $op        = $input->param('op');
74
my %cookies   = parse CGI::Cookie($cookie);
75
my $sessionID = $cookies{'CGISESSID'}->value;
73
76
74
my $error;
77
my $error;
75
78
76
$template->{VARS}->{'filetype'} = $filetype;
79
$template->{VARS}->{'filetype'}     = $filetype;
77
$template->{VARS}->{'biblionumber'} = $biblionumber;
80
$template->{VARS}->{'biblionumber'} = $biblionumber;
78
81
79
my $total = 0;
82
my $total = 0;
80
83
81
82
if ($fileID) {
84
if ($fileID) {
83
    my $uploaded_file = C4::UploadedFile->fetch($sessionID, $fileID);
85
    my $uploaded_file = C4::UploadedFile->fetch( $sessionID, $fileID );
84
    if ($filetype eq 'image') {
86
    if ( $filetype eq 'image' ) {
85
        my $fh = $uploaded_file->fh();
87
        my $fh       = $uploaded_file->fh();
86
        my $srcimage = GD::Image->new($fh);
88
        my $srcimage = GD::Image->new($fh);
87
        if (defined $srcimage) {
89
        if ( defined $srcimage ) {
88
            my $dberror = PutImage($biblionumber, $srcimage, $replace);
90
            my $dberror = PutImage( $biblionumber, $srcimage, $replace );
89
            if ($dberror) {
91
            if ($dberror) {
90
                $error = 'DBERR';
92
                $error = 'DBERR';
91
            } else {
93
            }
94
            else {
92
                $total = 1;
95
                $total = 1;
93
            }
96
            }
94
        } else {
97
        }
98
        else {
95
            $error = 'OPNIMG';
99
            $error = 'OPNIMG';
96
        }
100
        }
97
        undef $srcimage;
101
        undef $srcimage;
98
    } else {
102
    }
103
    else {
99
        my $filename = $uploaded_file->filename();
104
        my $filename = $uploaded_file->filename();
100
        my $dirname = File::Temp::tempdir( CLEANUP => 1);
105
        my $dirname = File::Temp::tempdir( CLEANUP => 1 );
101
        unless (system("unzip", $filename,  '-d', $dirname) == 0) {
106
        unless ( system( "unzip", $filename, '-d', $dirname ) == 0 ) {
102
            $error = 'UZIPFAIL';
107
            $error = 'UZIPFAIL';
103
        } else {
108
        }
109
        else {
104
            my @directories;
110
            my @directories;
105
            push @directories, "$dirname";
111
            push @directories, "$dirname";
106
            foreach my $recursive_dir ( @directories ) {
112
            foreach my $recursive_dir (@directories) {
107
                my $dir;
113
                my $dir;
108
                opendir $dir, $recursive_dir;
114
                opendir $dir, $recursive_dir;
109
                while ( my $entry = readdir $dir ) {
115
                while ( my $entry = readdir $dir ) {
110
                    push @directories, "$recursive_dir/$entry" if ( -d "$recursive_dir/$entry" and $entry !~ /^[._]/ );
116
                    push @directories, "$recursive_dir/$entry"
117
                      if ( -d "$recursive_dir/$entry" and $entry !~ /^[._]/ );
111
                }
118
                }
112
                closedir $dir;
119
                closedir $dir;
113
            }
120
            }
114
            foreach my $dir ( @directories ) {
121
            foreach my $dir (@directories) {
115
                my $file;
122
                my $file;
116
                if ( -e "$dir/idlink.txt" ) {
123
                if ( -e "$dir/idlink.txt" ) {
117
                    $file = "$dir/idlink.txt";
124
                    $file = "$dir/idlink.txt";
118
                } elsif ( -e "$dir/datalink.txt" ) {
125
                }
126
                elsif ( -e "$dir/datalink.txt" ) {
119
                    $file = "$dir/datalink.txt";
127
                    $file = "$dir/datalink.txt";
120
                } else {
128
                }
129
                else {
121
                    next;
130
                    next;
122
                }
131
                }
123
                if (open (FILE, $file)) {
132
                if ( open( FILE, $file ) ) {
124
                    while (my $line = <FILE>) {
133
                    while ( my $line = <FILE> ) {
125
                        my $delim = ($line =~ /\t/) ? "\t" : ($line =~ /,/) ? "," : "";
134
                        my $delim =
135
                            ( $line =~ /\t/ ) ? "\t"
136
                          : ( $line =~ /,/ )  ? ","
137
                          :                     "";
138
126
                        #$debug and warn "Delimeter is \'$delim\'";
139
                        #$debug and warn "Delimeter is \'$delim\'";
127
                        unless ( $delim eq "," || $delim eq "\t" ) {
140
                        unless ( $delim eq "," || $delim eq "\t" ) {
128
                            warn "Unrecognized or missing field delimeter. Please verify that you are using either a ',' or a 'tab'";
141
                            warn
142
"Unrecognized or missing field delimeter. Please verify that you are using either a ',' or a 'tab'";
129
                            $error = 'DELERR';
143
                            $error = 'DELERR';
130
                        } else {
144
                        }
131
                            ($biblionumber, $filename) = split $delim, $line;
145
                        else {
132
                            $biblionumber =~ s/[\"\r\n]//g;  # remove offensive characters
146
                            ( $biblionumber, $filename ) = split $delim, $line;
133
                            $filename   =~ s/[\"\r\n\s]//g;
147
                            $biblionumber =~
148
                              s/[\"\r\n]//g;    # remove offensive characters
149
                            $filename =~ s/[\"\r\n\s]//g;
134
                            my $srcimage = GD::Image->new("$dir/$filename");
150
                            my $srcimage = GD::Image->new("$dir/$filename");
135
                            if (defined $srcimage) {
151
                            if ( defined $srcimage ) {
136
                                $total++;
152
                                $total++;
137
                                my $dberror = PutImage($biblionumber, $srcimage, $replace);
153
                                my $dberror =
154
                                  PutImage( $biblionumber, $srcimage,
155
                                    $replace );
138
                                if ($dberror) {
156
                                if ($dberror) {
139
                                    $error = 'DBERR';
157
                                    $error = 'DBERR';
140
                                }
158
                                }
141
                            } else {
159
                            }
160
                            else {
142
                                $error = 'OPNIMG';
161
                                $error = 'OPNIMG';
143
                            }
162
                            }
144
                            undef $srcimage;
163
                            undef $srcimage;
145
                        }
164
                        }
146
                    }
165
                    }
147
                    close(FILE);
166
                    close(FILE);
148
                } else {
167
                }
168
                else {
149
                    $error = 'OPNLINK';
169
                    $error = 'OPNLINK';
150
                }
170
                }
151
            }
171
            }
152
        }
172
        }
153
    }
173
    }
154
    $template->{VARS}->{'total'} = $total;
174
    $template->{VARS}->{'total'}        = $total;
155
    $template->{VARS}->{'uploadimage'} = 1;
175
    $template->{VARS}->{'uploadimage'}  = 1;
156
    $template->{VARS}->{'error'} = $error;
176
    $template->{VARS}->{'error'}        = $error;
157
    $template->{VARS}->{'biblionumber'} = $biblionumber;
177
    $template->{VARS}->{'biblionumber'} = $biblionumber;
158
}
178
}
159
179
160
- 

Return to bug 1633