Bug 17501: Remove Koha::Upload::get from Koha::Upload
authorMarcel de Rooy <m.de.rooy@rijksmuseum.nl>
Tue, 22 Nov 2016 15:57:21 +0000 (16:57 +0100)
committerKyle M Hall <kyle@bywatersolutions.com>
Fri, 20 Jan 2017 14:20:05 +0000 (14:20 +0000)
The get routine actually returns records from uploaded_files. It should be
possible to replace its calls by direct calls of Koha::UploadedFiles.

This patch is the crux of this patch set. It deals with all scripts that
use Koha::Upload.

In the process we do:
[1] Add a file_handle method to Koha::UploadedFile. This was previously
    arranged via the fh parameter of get.
[2] Add a full_path method to UploadedFile. Previously returned in the
    path hash key of get. (Name is replaced by filename.)
[3] Add a search_term method too (implementing get({ term => .. }).
    This logic came from _lookup.
[4] Add a keep_file parameter to delete method. Only used in test now.

Test plan:
[1] Run t/db_dependent/Upload.t
[2] Go to Tools/Upload. Add an upload, download and delete.
[3] Add another public upload , search for it.
    Use the hashvalue to download via opac with URL:
        cgi-bin/koha/opac-retrieve-file.pl?id=[hashvalue]
[4] Go to Tools/Stage MARC for import. Import a marc file.
[5] Go to Tools/Upload local cover image. Import an image file.
    Enable OPACLocalCoverImages to see result.
[6] Test uploading a offline circulation file:
    Enable AllowOfflineCirculation, and create a koc file (plain text):
    Line1: Version=1.0\tA=1\tB=2
    Line2: 2016-11-23 16:00:00 345\treturn\t[barcode]
    Note: Replace tabs and barcode. The number of tabs is essential!
    Checkout the item with your barcode.
    Go to Circulation/Offline circulation file upload.
    Upload and click Apply directly.
    Checkout again. Repeat Offline circulation file upload.
    Now click Add to offline circulation queue.
[7] Connect the upload plugin to field 856$u.
    Enable HTML5MediaEnabled.
    Upload a webm file via the plugin. Click Choose to save the URL,
    and put 'video/webm' into 856$q. Save the biblio record.
    Check if you see the media tab with player on staff detail.
    (See also: Bug 17673 about empty OPACBaseURL.)

Signed-off-by: Marcel de Rooy <m.de.rooy@rijksmuseum.nl>
Signed-off-by: Tomas Cohen Arazi <tomascohen@theke.io>

Signed-off-by: Jonathan Druart <jonathan.druart@bugs.koha-community.org>

Signed-off-by: Kyle M Hall <kyle@bywatersolutions.com>

12 files changed:
C4/HTML5Media.pm
Koha/Upload.pm
Koha/UploadedFile.pm
Koha/UploadedFiles.pm
koha-tmpl/intranet-tmpl/prog/en/modules/tools/upload.tt
offline_circ/enqueue_koc.pl
offline_circ/process_koc.pl
opac/opac-retrieve-file.pl
t/db_dependent/Upload.t
tools/stage-marc-import.pl
tools/upload-cover-image.pl
tools/upload.pl

index 7f6dff6..1ac22f1 100644 (file)
@@ -22,7 +22,7 @@ use warnings;
 
 use C4::Context;
 use MARC::Field;
-use Koha::Upload;
+use Koha::UploadedFiles;
 
 =head1 HTML5Media
 
@@ -134,10 +134,12 @@ sub gethtml5media {
         if ( $HTML5Media{srcblock} =~ /\Qopac-retrieve-file.pl\E/ ) {
             my ( undef, $id ) = split /id=/, $HTML5Media{srcblock};
             next if !$id;
-            my $public = ( ( caller )[1] =~ /opac/ ) ? { public => 1 }: {};
-            my $upl = Koha::Upload->new( $public )->get({ hashvalue => $id });
-            next if !$upl || $upl->{name} !~ /\./;
-            $HTML5Media{extension} = ( $upl->{name} =~ m/([^.]+)$/ )[0];
+            my %public = ( ( caller )[1] =~ /opac/ ) ? ( public => 1 ): ();
+            my $upload = Koha::UploadedFiles->search({
+                hashvalue => $id, %public,
+            })->next;
+            next if !$upload || $upload->filename !~ /\./;
+            $HTML5Media{extension} = ( $upload->filename =~ m/([^.]+)$/ )[0];
         }
         # check remote files
         else {
index e5a6c17..6a375cd 100644 (file)
@@ -26,6 +26,7 @@ Koha::Upload - Facilitate file uploads (temporary and permanent)
 =head1 SYNOPSIS
 
     use Koha::Upload;
+    use Koha::UploadedFiles;
 
     # add an upload (see tools/upload-file.pl)
     # the public flag allows retrieval via OPAC
@@ -34,14 +35,13 @@ Koha::Upload - Facilitate file uploads (temporary and permanent)
     # Do something with $upload->count, $upload->result or $upload->err
 
     # get some upload records (in staff)
-    # Note: use the public flag for OPAC
-    my @uploads = Koha::Upload->new->get( term => $term );
-    $template->param( uploads => \@uploads );
+    my @uploads1 = Koha::UploadedFiles->search({ filename => $name });
+    my @uploads2 = Koha::UploadedFiles->search_term({ term => $term });
 
     # staff download
-    my $rec = Koha::Upload->new->get({ id => $id, filehandle => 1 });
-    my $fh = $rec->{fh};
-    my @hdr = Koha::Upload->httpheaders( $rec->{name} );
+    my $rec = Koha::UploadedFiles->find( $id );
+    my $fh = $rec->file_handle;
+    my @hdr = Koha::Upload->httpheaders( $rec->filename );
     print Encode::encode_utf8( $input->header( @hdr ) );
     while( <$fh> ) { print $_; }
     $fh->close;
@@ -54,9 +54,9 @@ Koha::Upload - Facilitate file uploads (temporary and permanent)
     functionality of both.
 
     The module has been revised to use Koha::Object[s]; the delete method
-    has been moved to Koha::UploadedFile[s].
+    has been moved to Koha::UploadedFile[s], as well as the get method.
 
-=head1 METHODS
+=head1 INSTANCE METHODS
 
 =cut
 
@@ -158,40 +158,6 @@ sub err {
     return $err;
 }
 
-=head2 get
-
-    Returns arrayref of uploaded records (hash) or one uploaded record.
-    You can pass id => $id or hashvalue => $hash or term => $term.
-    Optional parameter filehandle => 1 returns you a filehandle too.
-
-=cut
-
-sub get {
-    my ( $self, $params ) = @_;
-    my $temp= $self->_lookup( $params );
-    my ( @rv, $res);
-    foreach my $r ( @$temp ) {
-        undef $res;
-        foreach( qw[id hashvalue filesize uploadcategorycode public permanent owner] ) {
-            $res->{$_} = $r->{$_};
-        }
-        $res->{name} = $r->{filename};
-        $res->{path} = $self->_full_fname($r);
-        if( $res->{path} && -r $res->{path} ) {
-            if( $params->{filehandle} ) {
-                my $fh = IO::File->new( $res->{path}, "r" );
-                $fh->binmode if $fh;
-                $res->{fh} = $fh;
-            }
-            push @rv, $res;
-        } else {
-            $self->{files}->{ $r->{filename} }->{errcode}=5; #not readable
-        }
-        last if !wantarray;
-    }
-    return wantarray? @rv: $res;
-}
-
 =head1 CLASS METHODS
 
 =head2 getCategories
@@ -292,10 +258,10 @@ sub _create_file {
         # if the file exists and it is registered, then set error
         # if it exists, but is not in the database, we will overwrite
         if( -e "$dir/$fn" &&
-            Koha::UploadedFiles->search({
-                hashvalue          => $hashval,
-                uploadcategorycode => $self->{category},
-            })->count ) {
+        Koha::UploadedFiles->search({
+            hashvalue          => $hashval,
+            uploadcategorycode => $self->{category},
+        })->count ) {
             $self->{files}->{$filename}->{errcode} = 1; #already exists
             return;
         }
@@ -319,19 +285,6 @@ sub _dir {
     return $dir;
 }
 
-sub _full_fname {
-    my ( $self, $rec ) = @_;
-    my $p;
-    if( ref $rec ) {
-        $p = File::Spec->catfile(
-            $rec->{permanent}? $self->{rootdir}: $self->{tmpdir},
-            $rec->{dir},
-            $rec->{hashvalue}. '_'. $rec->{filename}
-        );
-    }
-    return $p;
-}
-
 sub _hook {
     my ( $self, $filename, $buffer, $bytes_read, $data ) = @_;
     $filename= Encode::decode_utf8( $filename ); # UTF8 chars in filename
@@ -366,29 +319,6 @@ sub _register {
     $self->{files}->{$filename}->{id} = $rec->id if $rec;
 }
 
-sub _lookup {
-    my ( $self, $params ) = @_;
-
-    my ( $cond, $attr, %pubhash );
-    %pubhash = $self->{public}? ( public => 1 ): ();
-    if( $params->{id} ) {
-        return [] if $params->{id} !~ /^\d+(,\d+)*$/;
-        $cond = { id => [ split ',', $params->{id} ], %pubhash };
-    } elsif( $params->{hashvalue} ) {
-        $cond = { hashvalue => $params->{hashvalue}, %pubhash };
-    } elsif( $params->{term} ) {
-        $cond =
-            [ { filename => { like => '%'.$params->{term}.'%' }, %pubhash },
-              { hashvalue => { like => '%'.$params->{term}.'%' }, %pubhash } ];
-    } else {
-        return [];
-    }
-    $attr = { order_by => { -asc => 'id' }};
-
-    return Koha::UploadedFiles->search( $cond, $attr )->unblessed;
-    # Does always return an arrayref (perhaps an empty one)
-}
-
 sub _compute {
 # Computes hash value when sub hook feeds the first block
 # For temporary files, the id is made unique with time
index 01d0580..4b2a151 100644 (file)
@@ -43,19 +43,22 @@ Description
 =head3 delete
 
 Delete uploaded file.
-It deletes not only the record, but also the actual file.
+It deletes not only the record, but also the actual file (unless you pass
+the keep_file parameter).
 
 Returns filename on successful delete or undef.
 
 =cut
 
 sub delete {
-    my ( $self ) = @_;
+    my ( $self, $params ) = @_;
 
     my $name = $self->filename;
     my $file = $self->full_path;
 
-    if( !-e $file ) { # we will just delete the record
+    if( $params->{keep_file} ) {
+        return $name if $self->SUPER::delete;
+    } elsif( !-e $file ) { # we will just delete the record
         warn "Removing record for $name within category ".
             $self->uploadcategorycode. ", but file was missing.";
         return $name if $self->SUPER::delete;
@@ -84,6 +87,20 @@ sub full_path {
     return $path;
 }
 
+=head3 file_handle
+
+Returns a file handle for an uploaded file.
+
+=cut
+
+sub file_handle {
+    my ( $self ) = @_;
+    $self->{_file_handle} = IO::File->new( $self->full_path, "r" );
+    return if !$self->{_file_handle};
+    $self->{_file_handle}->binmode;
+    return $self->{_file_handle};
+}
+
 =head2 CLASS METHODS
 
 =head3 root_directory
index 36eb0d2..7587dfa 100644 (file)
@@ -46,15 +46,17 @@ Delete uploaded files.
 Returns true if no errors occur.
 Delete_errors returns the number of errors when deleting files.
 
+Parameter keep_file may be used to delete records, but keep files.
+
 =cut
 
 sub delete {
-    my ( $self ) = @_;
+    my ( $self, $params ) = @_;
     # We use the individual delete on each resultset record
     my $err = 0;
     while( my $row = $self->_resultset->next ) {
         my $kohaobj = Koha::UploadedFile->_new_from_dbic( $row );
-        $err++ if !$kohaobj->delete;
+        $err++ if !$kohaobj->delete( $params );
     }
     $self->{delete_errors} = $err;
     return $err==0;
@@ -65,6 +67,29 @@ sub delete_errors {
     return $self->{delete_errors};
 }
 
+=head3 search_term
+
+Search_term allows you to pass a term to search in filename and hashvalue.
+If you do not pass include_private, only public records are returned.
+
+Is only a wrapper around Koha::Objects search. Has similar return value.
+
+=cut
+
+sub search_term {
+    my ( $self, $params ) = @_;
+    my $term = $params->{term} // '';
+    my %public = ();
+    if( !$params->{include_private} ) {
+        %public = ( public => 1 );
+    }
+    return $self->search(
+        [ { filename => { like => '%'.$term.'%' }, %public },
+          { hashvalue => { like => '%'.$params->{term}.'%' }, %public } ],
+        { order_by => { -asc => 'id' }},
+    );
+}
+
 =head2 CLASS METHODS
 
 =head3 _type
index f89ef03..45c6b79 100644 (file)
     <tbody>
     [% FOREACH record IN uploads %]
     <tr>
-        <td>[% record.name %]</td>
+        <td>[% record.filename %]</td>
         <td>[% record.filesize %]</td>
         <td>[% record.hashvalue %]</td>
         <td>[% record.uploadcategorycode %]</td>
index a81aecb..73a5053 100755 (executable)
@@ -32,7 +32,7 @@ use C4::Circulation;
 use C4::Items;
 use C4::Members;
 use C4::Stats;
-use Koha::Upload;
+use Koha::UploadedFiles;
 
 use Date::Calc qw( Add_Delta_Days Date_to_Days );
 
@@ -60,9 +60,10 @@ my $sessionID = $cookies{'CGISESSID'}->value;
 our $dbh = C4::Context->dbh();
 
 if ($fileID) {
-    my $upload = Koha::Upload->new->get({ id => $fileID, filehandle => 1 });
-    my $fh = $upload->{fh};
-    my @input_lines = <$fh>;
+    my $upload = Koha::UploadedFiles->find($fileID);
+    my $fh = $upload? $upload->file_handle: undef;
+    my @input_lines = $fh? <$fh>: ();
+    $fh->close if $fh;
 
     my $header_line = shift @input_lines;
     my $file_info   = parse_header_line($header_line);
index f959d6f..dbe8c40 100755 (executable)
@@ -35,7 +35,7 @@ use C4::Items;
 use C4::Members;
 use C4::Stats;
 use C4::BackgroundJob;
-use Koha::Upload;
+use Koha::UploadedFiles;
 use Koha::Account;
 use Koha::Patrons;
 
@@ -73,10 +73,11 @@ if ($completedJobID) {
     $template->param(transactions_loaded => 1);
     $template->param(messages => $results->{results});
 } elsif ($fileID) {
-    my $upload = Koha::Upload->new->get({ id => $fileID, filehandle => 1 });
-    my $fh = $upload->{fh};
-    my $filename = $upload->{name};
-    my @input_lines = <$fh>;
+    my $upload = Koha::UploadedFiles->find( $fileID );
+    my $fh = $upload? $upload->file_handle: undef;
+    my $filename = $upload? $upload->filename: undef;
+    my @input_lines = $fh? <$fh>: ();
+    $fh->close if $fh;
 
     my $job = undef;
 
index b443a7c..cd2afbe 100755 (executable)
@@ -25,13 +25,17 @@ use C4::Auth;
 use C4::Context;
 use C4::Output;
 use Koha::Upload;
+use Koha::UploadedFiles;
 
 my $input = CGI::->new;
 my $hash = $input->param('id'); # historically called id (used in URLs?)
 
-my $upl = Koha::Upload->new({ public => 1 });
-my $rec = $upl->get({ hashvalue => $hash, filehandle => 1 });
-my $fh = $rec->{fh};
+my $rec = Koha::UploadedFiles->search({
+    hashvalue => $hash, public => 1,
+    # DO NOT REMOVE the public flag: this is an opac script !
+})->next;
+my $fh = $rec? $rec->file_handle: undef;
+
 if( !$rec || !$fh ) {
     my ( $template, $user, $cookie ) = get_template_and_user({
         query           => $input,
@@ -42,7 +46,7 @@ if( !$rec || !$fh ) {
     $template->param( hash => $hash );
     output_html_with_http_headers $input, $cookie, $template->output;
 } else {
-    my @hdr = $upl->httpheaders( $rec->{name} );
+    my @hdr = Koha::Upload->httpheaders( $rec->filename );
     print Encode::encode_utf8( $input->header( @hdr ) );
     while( <$fh> ) {
         print $_;
index 239874d..b35e18b 100644 (file)
@@ -15,7 +15,6 @@ use Koha::UploadedFiles;
 
 my $schema  = Koha::Database->new->schema;
 $schema->storage->txn_begin;
-my $dbh = C4::Context->dbh;
 
 our $current_upload = 0;
 our $uploads = [
@@ -37,7 +36,7 @@ our $uploads = [
         { name => 'file4', cat => undef, size => 5000 }, # temp duplicate
     ],
     [
-        { name => 'file5', cat => undef, size => 7000 }, # temp duplicate
+        { name => 'file5', cat => undef, size => 7000 },
     ],
 ];
 
@@ -51,11 +50,11 @@ $cgimod->mock( 'new' => \&newCGI );
 
 # Start testing
 subtest 'Test01' => sub {
-    plan tests => 9;
+    plan tests => 11;
     test01();
 };
 subtest 'Test02' => sub {
-    plan tests => 4;
+    plan tests => 5;
     test02();
 };
 subtest 'Test03' => sub {
@@ -71,7 +70,7 @@ subtest 'Test05' => sub {
     test05();
 };
 subtest 'Test06' => sub {
-    plan tests => 2;
+    plan tests => 3;
     test06();
 };
 subtest 'Test07' => sub {
@@ -86,7 +85,8 @@ $schema->storage->txn_rollback;
 
 sub test01 {
     # Delete existing records (for later tests)
-    $dbh->do( "DELETE FROM uploaded_files" );
+    # Passing keep_file suppresses warnings
+    Koha::UploadedFiles->new->delete({ keep_file => 1 });
 
     # Check mocked directories
     is( Koha::UploadedFile->permanent_directory, $tempdir,
@@ -101,16 +101,19 @@ sub test01 {
     my $res= $upl->result;
     is( $res =~ /^\d+,\d+$/, 1, 'Upload 1 includes two files' );
     is( $upl->count, 2, 'Count returns 2 also' );
-    foreach my $r ( $upl->get({ id => $res }) ) {
-        if( $r->{name} eq 'file1' ) {
-            is( $r->{uploadcategorycode}, 'A', 'Check category A' );
-            is( $r->{filesize}, 6000, 'Check size of file1' );
-        } elsif( $r->{name} eq 'file2' ) {
-            is( $r->{filesize}, 8000, 'Check size of file2' );
-            is( $r->{public}, undef, 'Check public undefined' );
-        }
-    }
     is( $upl->err, undef, 'No errors reported' );
+
+    my $rs = Koha::UploadedFiles->search({
+        id => [ split ',', $res ]
+    }, { order_by => { -asc => 'filename' }});
+    my $rec = $rs->next;
+    is( $rec->filename, 'file1', 'Check file name' );
+    is( $rec->uploadcategorycode, 'A', 'Check category A' );
+    is( $rec->filesize, 6000, 'Check size of file1' );
+    $rec = $rs->next;
+    is( $rec->filename, 'file2', 'Check file name 2' );
+    is( $rec->filesize, 8000, 'Check size of file2' );
+    is( $rec->public, undef, 'Check public undefined' );
 }
 
 sub test02 {
@@ -121,18 +124,24 @@ sub test02 {
     my $cgi= $upl->cgi;
     is( $upl->count, 1, 'Upload 2 includes one file' );
     my $res= $upl->result;
-    my $r = $upl->get({ id => $res, filehandle => 1 });
-    is( $r->{uploadcategorycode}, 'B', 'Check category B' );
-    is( $r->{public}, 1, 'Check public == 1' );
-    is( ref($r->{fh}) eq 'IO::File' && $r->{fh}->opened, 1, 'Get returns a file handle' );
+    my $rec = Koha::UploadedFiles->find( $res );
+    is( $rec->uploadcategorycode, 'B', 'Check category B' );
+    is( $rec->public, 1, 'Check public == 1' );
+    my $fh = $rec->file_handle;
+    is( ref($fh) eq 'IO::File' && $fh->opened, 1, 'Get returns a file handle' );
+
+    my $orgname = $rec->filename;
+    $rec->filename( 'doesprobablynotexist' )->store;
+    is( $rec->file_handle, undef, 'Sabotage with file handle' );
+    $rec->filename( $orgname )->store;
 }
 
 sub test03 {
     my $upl = Koha::Upload->new({ tmp => 1 }); #temporary
     my $cgi= $upl->cgi;
     is( $upl->count, 1, 'Upload 3 includes one temporary file' );
-    my $r = $upl->get({ id => $upl->result });
-    is( $r->{uploadcategorycode} =~ /_upload$/, 1, 'Check category temp file' );
+    my $rec = Koha::UploadedFiles->find( $upl->result );
+    is( $rec->uploadcategorycode =~ /_upload$/, 1, 'Check category temp file' );
 }
 
 sub test04 { # Fail on a file already there
@@ -151,34 +160,34 @@ sub test05 { # add temporary file with same name and contents, delete it
     my $cgi= $upl->cgi;
     is( $upl->count, 1, 'Upload 5 adds duplicate temporary file' );
     my $id = $upl->result;
-    my $r = $upl->get({ id => $id });
+    my $path = Koha::UploadedFiles->find( $id )->full_path;
 
     # testing delete via UploadedFiles (plural)
     my $delete = Koha::UploadedFiles->search({ id => $id })->delete;
     is( $delete, 1, 'Delete successful' );
-    isnt( -e $r->{path}, 1, 'File no longer found after delete' );
-    is( scalar $upl->get({ id => $id }), undef, 'Record also gone' );
+    isnt( -e $path, 1, 'File no longer found after delete' );
+    is( Koha::UploadedFiles->find( $id ), undef, 'Record also gone' );
 
     # testing delete via UploadedFile (singular)
     # Note that find returns a Koha::Object
     $upl = Koha::Upload->new({ tmp => 1 });
     $upl->cgi;
-    $id = $upl->result;
-    my $kohaobj = Koha::UploadedFiles->find( $id );
+    my $kohaobj = Koha::UploadedFiles->find( $upl->result );
     my $name = $kohaobj->filename;
-    my $path = $kohaobj->full_path;
+    $path = $kohaobj->full_path;
     $delete = $kohaobj->delete;
     is( $delete, $name, 'Delete successful' );
     isnt( -e $path, 1, 'File no longer found after delete' );
 }
 
-sub test06 { #some extra tests for get
-    my $upl = Koha::Upload->new({ public => 1 });
-    my @rec = $upl->get({ term => 'file' });
-    is( @rec, 1, 'Get returns only one public result (file3)' );
-    $upl = Koha::Upload->new; # public == 0
-    @rec = $upl->get({ term => 'file' });
-    is( @rec, 4, 'Get returns now four results' );
+sub test06 { #search_term with[out] private flag
+    my @recs = Koha::UploadedFiles->search_term({ term => 'file' });
+    is( @recs, 1, 'Returns only one public result' );
+    is( $recs[0]->filename, 'file3', 'Should be file3' );
+
+    is( Koha::UploadedFiles->search_term({
+        term => 'file', include_private => 1,
+    })->count, 4, 'Returns now four results' );
 }
 
 sub test07 { #simple test for httpheaders and getCategories
@@ -237,7 +246,7 @@ subtest 'Some basic CRUD testing' => sub {
     my $upload01 = $builder->build({ source => 'UploadedFile' });
     my $found = Koha::UploadedFiles->find( $upload01->{id} );
     is( $found->id, $upload01->{id}, 'Koha::Object returns id' );
-    $found->delete;
+    $found->delete({ keep_file => 1 }); #note that it does not exist
     $found = Koha::UploadedFiles->search(
         { id => $upload01->{id} },
     );
index 99506fc..63dd4e5 100755 (executable)
@@ -39,7 +39,7 @@ use C4::Output;
 use C4::Biblio;
 use C4::ImportBatch;
 use C4::Matcher;
-use Koha::Upload;
+use Koha::UploadedFiles;
 use C4::BackgroundJob;
 use C4::MarcModificationTemplates;
 use Koha::Plugins;
@@ -85,8 +85,10 @@ if ($completedJobID) {
     my $results = $job->results();
     $template->param(map { $_ => $results->{$_} } keys %{ $results });
 } elsif ($fileID) {
-    my $upload = Koha::Upload->new->get({ id => $fileID });
-    my ( $file, $filename ) = ( $upload->{path}, $upload->{name} );
+    my $upload = Koha::UploadedFiles->find( $fileID );
+    my $file = $upload->full_path;
+    my $filename = $upload->filename;
+
     my ( $errors, $marcrecords );
     if( $format eq 'MARCXML' ) {
         ( $errors, $marcrecords ) = C4::ImportBatch::RecordsFromMARCXMLFile( $file, $encoding);
index 79c37f2..dd73bbb 100755 (executable)
@@ -47,7 +47,7 @@ use C4::Context;
 use C4::Auth;
 use C4::Output;
 use C4::Images;
-use Koha::Upload;
+use Koha::UploadedFiles;
 use C4::Log;
 
 my $debug = 1;
@@ -68,7 +68,7 @@ my ( $template, $loggedinuser, $cookie ) = get_template_and_user(
 
 my $filetype       = $input->param('filetype');
 my $biblionumber   = $input->param('biblionumber');
-my $uploadfilename = $input->param('uploadfile');
+#my $uploadfilename = $input->param('uploadfile'); # obsolete?
 my $replace        = !C4::Context->preference("AllowMultipleCovers")
   || $input->param('replace');
 my $op        = $input->param('op');
@@ -83,10 +83,11 @@ $template->{VARS}->{'biblionumber'} = $biblionumber;
 my $total = 0;
 
 if ($fileID) {
-    my $upload = Koha::Upload->new->get({ id => $fileID, filehandle => 1 });
+    my $upload = Koha::UploadedFiles->find( $fileID );
     if ( $filetype eq 'image' ) {
-        my $fh       = $upload->{fh};
+        my $fh       = $upload->file_handle;
         my $srcimage = GD::Image->new($fh);
+        $fh->close if $fh;
         if ( defined $srcimage ) {
             my $dberror = PutImage( $biblionumber, $srcimage, $replace );
             if ($dberror) {
@@ -102,7 +103,7 @@ if ($fileID) {
         undef $srcimage;
     }
     else {
-        my $filename = $upload->{path};
+        my $filename = $upload->full_path;
         my $dirname = File::Temp::tempdir( CLEANUP => 1 );
         unless ( system( "unzip", $filename, '-d', $dirname ) == 0 ) {
             $error = 'UZIPFAIL';
index ff31dd7..a5d3b3c 100755 (executable)
@@ -24,6 +24,7 @@ use JSON;
 use C4::Auth;
 use C4::Output;
 use Koha::Upload;
+use Koha::UploadedFiles;
 
 my $input  = CGI::->new;
 my $op     = $input->param('op') // 'new';
@@ -48,7 +49,6 @@ $template->param(
     plugin     => $plugin,
 );
 
-my $upar = $plugin ? { public => 1 } : {};
 if ( $op eq 'new' ) {
     $template->param(
         mode             => 'new',
@@ -57,12 +57,24 @@ if ( $op eq 'new' ) {
     output_html_with_http_headers $input, $cookie, $template->output;
 
 } elsif ( $op eq 'search' ) {
-    my $h = $id ? { id => $id } : { term => $term };
-    my @uploads = Koha::Upload->new($upar)->get($h);
+    my $uploads;
+    if( $id ) {
+        my $rec = Koha::UploadedFiles->search({
+            id => $id,
+            $plugin? ( public => 1 ) : (),
+        })->next;
+        push @$uploads, $rec->unblessed if $rec;
+    } else {
+        $uploads = Koha::UploadedFiles->search_term({
+            term => $term,
+            $plugin? (): ( include_private => 1 ),
+        })->unblessed;
+    }
+
     $template->param(
         mode    => 'report',
         msg     => $msg,
-        uploads => \@uploads,
+        uploads => $uploads,
     );
     output_html_with_http_headers $input, $cookie, $template->output;
 
@@ -86,18 +98,20 @@ if ( $op eq 'new' ) {
     output_html_with_http_headers $input, $cookie, $template->output;
 
 } elsif ( $op eq 'download' ) {
-    my $upl = Koha::Upload->new($upar);
-    my $rec = $upl->get( { id => $id, filehandle => 1 } );
-    my $fh  = $rec->{fh};
+    my $rec = Koha::UploadedFiles->search({
+        id => $id,
+        $plugin? ( public => 1 ) : (),
+    })->next;
+    my $fh  = $rec? $rec->file_handle:  undef;
     if ( !$rec || !$fh ) {
         $template->param(
             mode             => 'new',
             msg              => JSON::to_json( { $id => 5 } ),
-            uploadcategories => $upl->getCategories,
+            uploadcategories => Koha::Upload->getCategories,
         );
         output_html_with_http_headers $input, $cookie, $template->output;
     } else {
-        my @hdr = $upl->httpheaders( $rec->{name} );
+        my @hdr = Koha::Upload->httpheaders( $rec->filename );
         print Encode::encode_utf8( $input->header(@hdr) );
         while (<$fh>) {
             print $_;